您的位置:首页 > 其它

功能开发-店铺任务,导购个人任务后台设置

2017-05-15 14:45 369 查看
最近的新需求,就是可以在ERP后台设置店铺门店的任务计划,默认是按照店铺的任务/店铺导购人数来平均分配任务,可以分为日/周/月/季度/年任务,主要是针对店铺的销售额,开卡(关注公众号并注册会员数),加粉数(仅仅是关注公众号)来分配的,同时可以根据每个店铺导购人员的能力来评估,自定义每个人具体的任务量。

后台具体的页面如下图:



如果仅仅分配了任务量,没有点击拆分,则按照总额的数量来平均分给该店铺下的每一个导购,当然有时需求会发送改变,所以加了拆分的方式来自定义分配,比如设置了1000元销售量的店铺日任务,点击拆分后,弹框展示具体的设置。如下图:


在这里也可以点击平均分配,注意这里的分配额是按照3,3,4来拆分的,最后一个按照平均值加%取模的值来分配的,点击保存设置之后,我这里做法值暂时将这些json数据f保存在一个input的隐藏框中,粉丝和开卡数也同理,相当于有3个隐藏的input,里面存放了json数据,最后全部设置完成,点击新建任务的时候,再将这些input里面的json由字符串转换为json数据。具体的ajax参数如下:

var data = ajaxJson("../saveStoreTask",{"lbtm":param,"money":moneyobj,"card":cardobj,"fans":fansobj},"post");

lbtm参数是任务页面店铺的参数数据

money参数是一个金额list,该店铺有多少个导购则有多少条数据,主要存放拆分的每个导购销售额

card参数也是一个list,和上面一样,只是用与存放每个导购的开卡任务量的

fans同上,存放的是拆分后每个导购的加粉数据

后台接收格式:



后台的是一个LsBsTaskModel对象模型,该对象如下:

public class LsBsTaskdModel {
private LsBsTaskm lbtm;
private List<LsBsTaskd> money;
private List<LsBsTaskd> card;
private List<LsBsTaskd> fans;

后台的实现层首先判断model里的3个list里面是否有值,如果没有值,说明用户是没有点击拆分,所以我就直接获得lbtm里每个总额的参数平均分配,不为空则通过遍历的方式来保存任务。

因为我们的数据库是2张表:表结构如下

1.主表(保存任务菜单的主页面的数据,都是任务的总额)



2.任务从表(拆分的数据是保存在这张表里面的):



保存完成之后,当导购在手机APP(目前APP正在开发中),可以查看自己所在店铺的总任务量,以及分配给自己的任务量,效果截图如下:

1.查询店铺指标:



2.查看导购个人的任务量:



页面有点low,毕竟咱公司的UI仅仅只给我图片的设计图,代码还得自己写。。悲剧

后面还需要完成在手机端实现添加任务设置的功能。上图右上角的红色加号部分

最后是sql,光任务sql和个人任务sql就花了整个下午 店铺的任务sql如下:

<!--查看店铺任务  -->

  <select id="selectTaskByStore" parameterType="java.util.Map" resultType="com.leadsoft.plana.app.model.dto.UserEntDto">

  SELECT 

  task.TASKNAME AS taskname,

  DATE_FORMAT(task.STARTDATE,'%Y-%m-%d') AS taskstarttime,

  DATE_FORMAT(task.ENDDATE,'%Y-%m-%d') AS taskendtime,
task.SALESMONEYM AS sale,
(
SELECT SUM(oder.JSMONEY) FROM ls_bs_userinfo u 
LEFT JOIN ls_bs_taskd td 

  ON td.uid=u.acc 

  LEFT JOIN ls_bs_taskm tm 

  ON tm.taskid=td.taskid LEFT JOIN ls_bs_ordermaster oder

  ON oder.sid=tm.sid AND oder.WCMAN=td.uid

  WHERE oder.sid=task.sid AND oder.WCTIME > task.startdate AND oder.WCTIME < task.enddate
)
AS issale,
task.OPENCARCOUNTM AS opencard,
(
SELECT COUNT(vip.vid) FROM ls_bs_vipinfo vip WHERE vip.YWYID IN(
SELECT uid FROM ls_bs_taskd td LEFT JOIN 
(SELECT td.TASKID FROM ls_bs_taskm tm LEFT JOIN ls_bs_taskd td ON td.TASKID=tm.taskid WHERE td.UID=#{acc} and tm.eid=#{eid})AS tm
ON tm.taskid=td.TASKID WHERE vip.createtime > task.STARTDATE AND vip.createtime < task.enddate GROUP BY uid
)
)AS isopencard,
(
(SELECT COUNT(vip.vid) FROM ls_bs_vipinfo vip WHERE vip.YWYID IN(
SELECT uid FROM ls_bs_taskd td LEFT JOIN 
(SELECT td.TASKID FROM ls_bs_taskm tm LEFT JOIN ls_bs_taskd td ON td.TASKID=tm.taskid WHERE td.UID=#{acc} and tm.eid=#{eid})AS tm
ON tm.taskid=td.TASKID WHERE vip.createtime > task.STARTDATE AND vip.createtime < task.enddate GROUP BY uid
)
)/task.OPENCARCOUNTM*100

) AS opencarscale,
(
(
SELECT SUM(oder.JSMONEY) FROM ls_bs_userinfo u 
LEFT JOIN ls_bs_taskd td 

  ON td.uid=u.acc 

  LEFT JOIN ls_bs_taskm tm 

  ON tm.taskid=td.taskid LEFT JOIN ls_bs_ordermaster oder

  ON oder.sid=tm.sid AND oder.WCMAN=td.uid

  WHERE oder.sid=task.sid AND oder.WCTIME > task.startdate AND oder.WCTIME < task.enddate
)/task.SALESMONEYM*100
)AS salesscale

FROM 
(SELECT tm.TASKNAME,tm.STARTDATE,tm.ENDDATE,tm.SALESMONEYM,tm.SID,tm.OPENCARCOUNTM FROM ls_bs_taskm tm LEFT JOIN ls_bs_taskd td  ON tm.TASKID=td.TASKID WHERE td.uid=#{acc} and tm.eid=#{eid}) AS task

   </select>

我们用的是mybatis 所以直接上的配置文件里的sql语句

个人任务也基本雷同,如下:

<!--查询个人任务 -->

   <select id="selectTaskByUid" parameterType="java.util.Map" resultType="com.leadsoft.plana.app.model.dto.UserEntDto">

    SELECT 

    task.TASKNAME AS taskname,

    task.STARTDATE AS taskstarttime,

    task.ENDDATE AS taskendtime,
task.SALESMONEY AS sale,
(SELECT SUM(JSMONEY) FROM ls_bs_ordermaster oder LEFT JOIN ls_bs_taskd td ON td.uid=oder.WCMAN WHERE wcman=#{acc} AND WCTIME > task.STARTDATE AND WCTIME < task.ENDDATE)AS issale,
task.OPENCARCOUNT AS opencard, 
(SELECT COUNT(DISTINCT(vip.vid)) FROM ls_bs_vipinfo vip LEFT JOIN ls_bs_taskd td ON td.uid=vip.ywyid WHERE td.uid=#{acc} AND vip.CREATETIME > task.STARTDATE AND vip.CREATETIME < task.ENDDATE )
AS isopencard,
(
(
SELECT SUM(JSMONEY) FROM ls_bs_ordermaster oder LEFT JOIN ls_bs_taskd td ON td.uid=oder.WCMAN WHERE wcman=#{acc} AND WCTIME >task.STARTDATE AND WCTIME < task.ENDDATE
)/task.SALESMONEY*100
)AS salesscale,
(
(
SELECT COUNT(DISTINCT(vip.vid)) FROM ls_bs_vipinfo vip LEFT JOIN ls_bs_taskd td ON td.uid=vip.ywyid WHERE td.uid=#{acc} AND vip.CREATETIME > task.STARTDATE AND vip.CREATETIME < task.ENDDATE 
)/task.OPENCARCOUNT*100
)AS opencarscale
FROM 
(SELECT tm.TASKNAME,td.SALESMONEY,tm.STARTDATE,tm.ENDDATE,td.OPENCARCOUNT FROM  ls_bs_taskm tm LEFT JOIN ls_bs_taskd td ON tm.TASKID=td.TASKID WHERE td.uid=#{acc} AND tm.eid=#{eid})AS task 

  </select>

  

因为这里设计的内容比较多,包括销售额,需要去关联订单表和明细表,开卡注册数量又需要去关联vip表,还有总量和完成量的百分比量。本来为了效率就使用了一条sql完成,就是不知道使用了这么多的嵌套查询是否会适得其反。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐