功能开发-店铺任务,导购个人任务后台设置
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完成,就是不知道使用了这么多的嵌套查询是否会适得其反。。。
后台具体的页面如下图:
如果仅仅分配了任务量,没有点击拆分,则按照总额的数量来平均分给该店铺下的每一个导购,当然有时需求会发送改变,所以加了拆分的方式来自定义分配,比如设置了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完成,就是不知道使用了这么多的嵌套查询是否会适得其反。。。
相关文章推荐
- ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调试功能正常)
- 微信公众服务号接口接入,实现开发回复功能,而非后台设置
- [转贴]Symbian编程VC开发环境设置 (方便个人学习用,转载自 rocklys的专栏,转贴请搜索原作者)
- FreeBSD下设置个人开发平台
- 巧妙设置 激活Google日历任务功能-系统技巧
- C#制作QQ截图的自动框选功能的个人思路(二)<设置Hook>
- Eclipse开发JQuery环境设置(Spket),代码提示功能
- FreeBSD下设置个人开发平台
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之完成登录功能
- Android应用之个人应用软件开发(3)【SQLite数据库及理财功能实现】
- Android应用之个人应用软件开发(2)【签到功能和记账】
- 学习Windows Phone 7手机开发:后台任务之播放音乐
- Ajax个人开发心得(一)先从一个最简单的ajax功能模块说起,Ajax技术其实很简单
- Ubuntu上搭建android BSP的开发编译环境 && 设置定时编译任务 && ubuntu从10.04升级到12.04后编译出错
- 利用Windows 自带的任务计划功能设置闹钟
- ECSHOP二次开发中关于文档后台菜单的功能说明
- Symbian编程VC6开发环境设置——网上资料加个人经验篇
- 利用Windows 自带的任务计划功能设置闹钟
- 后台的grid显示出来的功能模块步骤-----个人总结--12.28
- Android开发之异步后台任务AsyncTask