zq-erp/src/main/java/com/matrix/biz/service/BizUserService.java
@@ -78,5 +78,5 @@ * 设置为推广员 * @param invitationId */ public int setToBeAnSalesman(String openId,String invitationId); public int setToBeAnSalesman(String openId,String invitationId,long gradeId); } zq-erp/src/main/java/com/matrix/biz/service/impl/BizUserServiceImpl.java
@@ -8,7 +8,6 @@ import com.matrix.core.exception.GlobleException; import com.matrix.core.pojo.PaginationVO; import com.matrix.core.tools.ModelUtils; import com.matrix.core.tools.UUIDUtil; import com.matrix.system.common.constance.AppConstance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -158,11 +157,12 @@ * @param invitationId */ @Override public int setToBeAnSalesman(String openId,String invitationId) { public int setToBeAnSalesman(String openId,String invitationId,long gradeId) { BizUser bizUser=bizUserDao.findByOpenId(openId); bizUser.setIsSales(BizUser.IS_SALES); bizUser.setParentOpenId(invitationId); bizUser.setBindingParentTime(new Date()); bizUser.setSalesmanGrade(gradeId); return bizUserDao.updateByModel(bizUser); } } zq-erp/src/main/java/com/matrix/system/common/service/impl/InitBusParameterSettingService.java
@@ -43,7 +43,7 @@ } /** * 初始化默认积分规则设置 * 初始化默认分销规则设置 */ public void initBusParameterFenxiaoSetting(SysCompany sysCompany) { long companyId = sysCompany.getComId(); @@ -55,6 +55,7 @@ ruleSettings.add(addScoreRuleSetting(FenxiaoSettingConstant.FX_APPLY_CONDITION, companyId)); ruleSettings.add(addScoreRuleSetting(FenxiaoSettingConstant.FX_TG_PLAN, companyId)); ruleSettings.add(addScoreRuleSetting(FenxiaoSettingConstant.FX_TG_POSTER, companyId)); ruleSettings.add(addScoreRuleSetting(FenxiaoSettingConstant.FX_ZGFY, companyId)); busParameterSettingsDao.batchInsert(ruleSettings); } zq-erp/src/main/java/com/matrix/system/fenxiao/action/FenXiaoSettingAction.java
@@ -60,6 +60,12 @@ String[] FXKGName={"分销开关"}; List<FenXiaoSettingVo> fxkgRuleSettingsVo = getRuleSettingsVo(FXKGCode,FXKGName,companyId); result.putInMap("fxkg", fxkgRuleSettingsVo); //自购返佣 String[] ZGFYCode={FenxiaoSettingConstant.FX_ZGFY}; String[] ZGFYName={"自购返佣"}; List<FenXiaoSettingVo> zgfyRuleSettingsVo = getRuleSettingsVo(ZGFYCode,ZGFYName,companyId); result.putInMap("zgfy", zgfyRuleSettingsVo); //分销模式 String[] FXMSCode={FenxiaoSettingConstant.FX_MODEL}; String[] FXMSName={"分销模式"}; zq-erp/src/main/java/com/matrix/system/fenxiao/constant/FenxiaoSettingConstant.java
@@ -10,6 +10,13 @@ */ public final static String FX_MODEL = "FX_MODEL"; /** * 自购返佣 1:是 2:否 */ public final static String FX_ZGFY = "FX_ZGFY"; public final static String FX_ZGFY_YES = "1"; public final static String FX_ZGFY_NO = "2"; /** * 申请方式 */ public final static String FX_APPLY_WAY = "FX_APPLY_WAY"; zq-erp/src/main/java/com/matrix/system/fenxiao/dto/UpdateFyfaDto.java
@@ -14,6 +14,9 @@ @ApiModelProperty(value = "方案名称") private String name; @ApiModelProperty(value = "自购返佣%") private Double selfCommission; @ApiModelProperty(value = "推广提成%") private Double sealesCommission; zq-erp/src/main/java/com/matrix/system/fenxiao/entity/ShopSalesmanGrade.java
@@ -33,6 +33,13 @@ private Double sealesCommission; /** * 自购返佣比例% */ private Double selfCommission; /** * 邀请提成 % zq-erp/src/main/java/com/matrix/system/fenxiao/service/ShopSalesmanApplyService.java
@@ -54,7 +54,7 @@ ShopSalesmanGradeDao shopSalesmanGradeDao; @Autowired private BizUserDao bizUserDao; BizUserDao bizUserDao; @Autowired BizUserService bizUserService; @@ -116,8 +116,13 @@ if(busParameterSettings!=null &&busParameterSettings.getParamValue().equals("1")){ //自动审核 //初始等级ID(公司id,是否为初始等级) QueryWrapper<ShopSalesmanGrade> queryWrapperOrepool = new QueryWrapper<>(); queryWrapperOrepool.eq("company_id", loginUser.getCompanyId()); queryWrapperOrepool.eq("is_default", 1); ShopSalesmanGrade shopSalesmanGrade = shopSalesmanGradeDao.selectOne(queryWrapperOrepool); shopSalesmanApply.setApplyStatus(ShopSalesmanApply.APPLY_STATUS_TG); bizUserService.setToBeAnSalesman(loginUser.getOpenId(),invitationId); bizUserService.setToBeAnSalesman(loginUser.getOpenId(),invitationId,shopSalesmanGrade.getId()); }else{ shopSalesmanApply.setApplyStatus(ShopSalesmanApply.APPLY_STATUS_DSH); @@ -225,6 +230,7 @@ //修改USER的状态 bizUser.setParentOpenId(parentUserId); bizUser.setBindingParentTime(new Date()); bizUser.setSalesmanGrade(shopSalesmanApply.getGradeId()); bizUserDao.updateByModel(bizUser); } @@ -371,6 +377,10 @@ if(StrUtil.isEmpty(name)) { return AjaxResult.buildFailInstance("请输入方案名称"); } Double selfCommission = updateFyfaDto.getSelfCommission(); if(ObjectUtil.isEmpty(selfCommission)) { return AjaxResult.buildFailInstance("请输入正确的自购返佣"); } Double sealesCommission = updateFyfaDto.getSealesCommission(); if(ObjectUtil.isEmpty(sealesCommission)) { return AjaxResult.buildFailInstance("请输入正确的推广提成"); @@ -384,6 +394,7 @@ ShopSalesmanGrade shopSalesmanGrade = new ShopSalesmanGrade(); shopSalesmanGrade.setCompanyId(updateFyfaDto.getCompanyId()); shopSalesmanGrade.setName(updateFyfaDto.getName()); shopSalesmanGrade.setSelfCommission(selfCommission); shopSalesmanGrade.setSealesCommission(sealesCommission); shopSalesmanGrade.setInvitationCommission(invitationCommission); shopSalesmanGrade.setGradeCondition(updateFyfaDto.getGradeCondition()); @@ -398,6 +409,7 @@ } selectById.setCompanyId(updateFyfaDto.getCompanyId()); selectById.setName(updateFyfaDto.getName()); selectById.setSelfCommission(selfCommission); selectById.setSealesCommission(sealesCommission); selectById.setInvitationCommission(invitationCommission); selectById.setGradeCondition(updateFyfaDto.getGradeCondition()); zq-erp/src/main/java/com/matrix/system/fenxiao/vo/FyfaManageVo.java
@@ -14,6 +14,9 @@ @ApiModelProperty(value = "方案名称") private String name; @ApiModelProperty(value = "自购返佣%") private Double selfCommission; @ApiModelProperty(value = "推广提成%") private Double sealesCommission; zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxSalesmanAction.java
@@ -168,6 +168,8 @@ loginUser = bizUserDao.selectById(loginUser.getUserId()); if(loginUser.getIsSales()==1){ return AjaxResult.buildSuccessInstance("只有非分销员才能被绑定成客户"); }if (StringUtils.isNotBlank(loginUser.getParentOpenId())){ return AjaxResult.buildSuccessInstance("已经被绑定"); }else{ if (StringUtils.isBlank(loginUser.getParentOpenId())) { Map<String, Object> updateParam = new HashMap<>(); @@ -203,7 +205,7 @@ String urlPath = baseSaveUrl + "/" + "wxacode" + "/" + targetImg; String qrcodeSavePath = WxacodeUtil.getWxacode(loginUser.getOpenId() + "", "pages/distributorCenter/applyFor/applyFor", MD5Util.strToMD5(loginUser.getOpenId())+"qrcode" String qrcodeSavePath = WxacodeUtil.getWxacode(loginUser.getUserId() + "", "pages/distributorCenter/applyFor/applyFor", MD5Util.strToMD5(loginUser.getOpenId())+"qrcode" ,weChatApiTools.getAppid(loginUser.getCompanyId()),weChatApiTools.getSecret(loginUser.getCompanyId())); BufferedImage qrcordImgBuf = ImageIO.read(new File(qrcodeSavePath)); zq-erp/src/main/java/com/matrix/system/shopXcx/bean/ShopAdvertis.java
@@ -63,12 +63,25 @@ */ private String linkUrl; /**连接的页面id */ private Long pageId; /** * 所属分类 */ @Extend private String adtName; private Long companyId; public Long getPageId() { return pageId; } public void setPageId(Long pageId) { this.pageId = pageId; } public Long getCompanyId() { return companyId; } zq-erp/src/main/java/com/matrix/system/shopXcx/bean/ShopSku.java
@@ -49,6 +49,11 @@ * 价格 */ private BigDecimal price; /** *自购提成 */ private BigDecimal selfPrice; /** *推广提成 */ @@ -282,4 +287,12 @@ return id.equals(((ShopSku) obj).getId()); } public BigDecimal getSelfPrice() { return selfPrice; } public void setSelfPrice(BigDecimal selfPrice) { this.selfPrice = selfPrice; } } zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/SalesOrderTask.java
@@ -1,13 +1,17 @@ package com.matrix.system.shopXcx.mqTask; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.matrix.biz.bean.BizUser; import com.matrix.biz.service.BizUserService; import com.matrix.core.constance.MatrixConstance; import com.matrix.core.tools.LogUtil; import com.matrix.core.tools.StringUtils; import com.matrix.system.common.bean.BusParameterSettings; import com.matrix.system.common.dao.BusParameterSettingsDao; import com.matrix.system.fenxiao.constant.FenxiaoSettingConstant; import com.matrix.system.fenxiao.dao.ShopSalesmanGradeDao; import com.matrix.system.fenxiao.dao.ShopSalesmanOrderDao; import com.matrix.system.fenxiao.entity.ShopSalesmanGrade; @@ -20,6 +24,7 @@ import com.matrix.system.hive.service.SysOrderService; import com.matrix.system.shopXcx.bean.ShopOrder; import com.matrix.system.shopXcx.bean.ShopOrderDetails; import com.matrix.system.shopXcx.bean.ShopProduct; import com.matrix.system.shopXcx.dao.ShopOrderDao; import com.matrix.system.shopXcx.dao.ShopOrderDetailsDao; import com.matrix.system.shopXcx.dao.ShopSkuDao; @@ -109,88 +114,129 @@ void handleExtensionOrder(ShopOrder order) { //判读客户是否存在上级,存在则产生上级的收益 BizUser bizUser = bizUserService.findByOpenId(order.getUserId()); if(StringUtils.isNotBlank(bizUser.getParentOpenId())){//存在上级 LogUtil.debug("处理分销订单userOpid={}",bizUser.getOpenId()); //判断是否重复生成 QueryWrapper queryWrapper=new QueryWrapper(); queryWrapper.eq("order_id",order.getId()); Integer orderCount = shopSalesmanOrderDao.selectCount(queryWrapper); if(orderCount==0){ ShopSalesmanOrder salesmanOrder=new ShopSalesmanOrder(); salesmanOrder.setCompanyId(order.getCompanyId()); salesmanOrder.setCreateBy(MatrixConstance.SYSTEM_USER); salesmanOrder.setUpdateBy(MatrixConstance.SYSTEM_USER); salesmanOrder.setCreateTime(new Date()); salesmanOrder.setUpdateTime(new Date()); salesmanOrder.setOrderId(Long.parseLong(order.getId()+"")); salesmanOrder.setUserId(order.getUserId()); salesmanOrder.setSalesUserId(bizUser.getParentOpenId()); salesmanOrder.setRevenueType(ShopSalesmanOrder.REVENUE_TYPE_SALES); salesmanOrder.setOrderStatus(ShopSalesmanOrder.STATUS_DJS); Double salesAmount=0D; Double invitationAmount=0D; Double orderTotal=0D; Double zk=1D; BizUser salesMan=bizUserService.findByOpenId(bizUser.getParentOpenId()); BizUser invitationMan=null; ShopSalesmanOrder invitationOrder=null; boolean hasInvitationMan=StringUtils.isNotBlank(salesMan.getParentOpenId()); //判断推广员是否还存在上级,存在则计算邀请收益 if(hasInvitationMan){ invitationMan=bizUserService.findByOpenId(salesMan.getParentOpenId()); invitationOrder=new ShopSalesmanOrder(); BeanUtils.copyProperties(salesmanOrder,invitationOrder); invitationOrder.setSalesUserId(invitationMan.getOpenId()); invitationOrder.setRevenueType(ShopSalesmanOrder.REVENUE_TYPE_INVITATION); LogUtil.debug("处理分销订单userOpid={}",bizUser.getOpenId()); //判断是否重复生成 QueryWrapper queryWrapper=new QueryWrapper(); queryWrapper.eq("order_id",order.getId()); Integer orderCount = shopSalesmanOrderDao.selectCount(queryWrapper); if(orderCount==0){ ShopSalesmanOrder salesmanOrder=new ShopSalesmanOrder(); salesmanOrder.setCompanyId(order.getCompanyId()); salesmanOrder.setCreateBy(MatrixConstance.SYSTEM_USER); salesmanOrder.setUpdateBy(MatrixConstance.SYSTEM_USER); salesmanOrder.setCreateTime(new Date()); salesmanOrder.setUpdateTime(new Date()); salesmanOrder.setOrderId(Long.parseLong(order.getId()+"")); salesmanOrder.setUserId(order.getUserId()); salesmanOrder.setRevenueType(ShopSalesmanOrder.REVENUE_TYPE_SALES); salesmanOrder.setOrderStatus(ShopSalesmanOrder.STATUS_DJS); Double selfAmount=0D; Double zk=1D; //分销订单总额 Double orderTotal=0D; for (ShopOrderDetails item:order.getDetails() ){ if(item.getShopProduct().getAbleSales()==ShopProduct.ABLE_SALES){ orderTotal+=item.getTotalPrice().doubleValue(); } //收益计算 } //自购返佣 Integer isSales = bizUser.getIsSales(); if(BizUser.IS_SALES == isSales){ for (ShopOrderDetails item:order.getDetails() ){ if(StringUtils.isNotBlank(item.getShopProduct().getAttrValues()) && item.getShopProduct().getAttrValues().contains("分销商城")){ if(item.getShopSku().getSealesPrice()==null ||item.getShopSku().getSealesPrice().doubleValue()==0){ //按分销等级计算 ShopSalesmanGrade shopSalesmanGrade = shopSalesmanGradeDao.selectById(salesMan.getSalesmanGrade()); salesAmount+=item.getTotalPrice().doubleValue()*(shopSalesmanGrade.getSealesCommission()/100); if(hasInvitationMan){ ShopSalesmanGrade invitationManGrade = shopSalesmanGradeDao.selectById(invitationMan.getSalesmanGrade()); invitationAmount+=item.getTotalPrice().doubleValue()*(invitationManGrade.getInvitationCommission()/100); } }else{ //按产品设置的推广金额计算 salesAmount+=item.getShopSku().getSealesPrice().doubleValue()*item.getCount(); if(hasInvitationMan){ invitationAmount+=item.getShopSku().getInvitationPrice().doubleValue()*item.getCount(); if(item.getShopProduct().getAbleSales()==ShopProduct.ABLE_SALES){ //分销规则是否开启自购返佣 BusParameterSettings zgfy = parameterSettingsDao.selectCompanyParamByCode(FenxiaoSettingConstant.FX_ZGFY, bizUser.getCompanyId()); //按分销等级计算 ShopSalesmanGrade shopSalesmanGrade = shopSalesmanGradeDao.selectById(bizUser.getSalesmanGrade()); if(ObjectUtil.isNotEmpty(zgfy)) { //获取商品的自购返佣价格,如果没有设置,在去获取当前推广人的等级的自购返佣比例 if(StrUtil.isNotEmpty(zgfy.getParamValue()) && FenxiaoSettingConstant.FX_ZGFY_YES.equals(zgfy.getParamValue())) { if(item.getShopSku().getSelfPrice() == null ||item.getShopSku().getSealesPrice().doubleValue() == 0){ selfAmount+=item.getTotalPrice().doubleValue()*(shopSalesmanGrade.getSelfCommission()/100); }else { //按产品设置的自购返佣金额计算 selfAmount+=item.getShopSku().getSelfPrice().doubleValue()*item.getCount(); } } } orderTotal+=item.getTotalPrice().doubleValue(); } } //自购返佣记录 if(selfAmount > 0) { //整体的优惠金额折算成折扣,* 佣金 zk=order.getOrderMoney().doubleValue()/orderTotal; selfAmount=selfAmount*zk; salesmanOrder.setAmount(selfAmount); salesmanOrder.setSalesUserId(order.getUserId()); shopSalesmanOrderDao.insert(salesmanOrder); } } //存在上级 if(StringUtils.isNotBlank(bizUser.getParentOpenId())) { BizUser salesMan=bizUserService.findByOpenId(bizUser.getParentOpenId()); Double salesAmount=0D; Double invitationAmount=0D; BizUser invitationMan=null; ShopSalesmanOrder invitationOrder=null; boolean hasInvitationMan=StringUtils.isNotBlank(salesMan.getParentOpenId()); //判断推广员是否还存在上级,存在则计算邀请收益 if(hasInvitationMan){ invitationMan=bizUserService.findByOpenId(salesMan.getParentOpenId()); invitationOrder=new ShopSalesmanOrder(); BeanUtils.copyProperties(salesmanOrder,invitationOrder); invitationOrder.setSalesUserId(invitationMan.getOpenId()); invitationOrder.setRevenueType(ShopSalesmanOrder.REVENUE_TYPE_INVITATION); } //收益计算 for (ShopOrderDetails item:order.getDetails() ){ if(item.getShopProduct().getAbleSales()==ShopProduct.ABLE_SALES){ //按分销等级计算 ShopSalesmanGrade shopSalesmanGrade = shopSalesmanGradeDao.selectById(salesMan.getSalesmanGrade()); //推广提成,按分销等级计算或者按产品设置的推广金额计算 if(item.getShopSku().getSealesPrice()==null ||item.getShopSku().getSealesPrice().doubleValue()==0){ salesAmount+=item.getTotalPrice().doubleValue()*(shopSalesmanGrade.getSealesCommission()/100); }else{ salesAmount+=item.getShopSku().getSealesPrice().doubleValue()*item.getCount(); } //邀请提成,获取商品的邀请提成价格和是否有上级推广人,如果没有设置,在去获取当前推广人的等级的自购返佣比例 if(hasInvitationMan) { if(item.getShopSku().getInvitationPrice() == null ||item.getShopSku().getInvitationPrice().doubleValue() == 0){ //获取上级的推广等级设置 ShopSalesmanGrade invitationManGrade = shopSalesmanGradeDao.selectById(invitationMan.getSalesmanGrade()); invitationAmount+=item.getTotalPrice().doubleValue()*(invitationManGrade.getInvitationCommission()/100); }else { //按产品设置的邀请提成价格计算 invitationAmount+=item.getShopSku().getInvitationPrice().doubleValue()*item.getCount(); } } } } //推广提成记录 if(salesAmount>0){ //整体的优惠金额折算成折扣,* 佣金 zk=order.getOrderMoney().doubleValue()/orderTotal; salesAmount=salesAmount*zk; salesmanOrder.setAmount(salesAmount); salesmanOrder.setSalesUserId(bizUser.getParentOpenId()); shopSalesmanOrderDao.insert(salesmanOrder); if(hasInvitationMan){ invitationAmount=invitationAmount*zk; invitationOrder.setAmount(invitationAmount); shopSalesmanOrderDao.insert(invitationOrder); } } //邀请提成记录 if(invitationAmount > 0) { //整体的优惠金额折算成折扣,* 佣金 invitationAmount=invitationAmount*zk; invitationOrder.setAmount(invitationAmount); shopSalesmanOrderDao.insert(invitationOrder); } }else{ LogUtil.debug("重复订单id={}",order.getId()); LogUtil.debug("不存在父级userOpid={}",bizUser.getOpenId()); } }else{ LogUtil.debug("不存在父级userOpid={}",bizUser.getOpenId()); LogUtil.debug("重复订单id={}",order.getId()); } } } zq-erp/src/main/resources/config/db/increment/推广员.sql
@@ -209,3 +209,15 @@ ALTER TABLE `shop_order` DROP COLUMN `score_pay`, ADD COLUMN `score_pay` int(20) NULL COMMENT '支付积分' AFTER `company_id`; ALTER TABLE `shop_advertis` ADD COLUMN `page_id` bigint(0) NULL COMMENT '连接页面' AFTER `company_id`; ALTER TABLE `shop_sku` DROP COLUMN `self_price`, ADD COLUMN `self_price` decimal(20,2) NULL AFTER `score_count`; ALTER TABLE `shop_salesman_grade` DROP COLUMN `self_commission`, ADD COLUMN `self_commission` double(20,2) NULL COMMENT '自购返佣比例%' AFTER `company_id`; zq-erp/src/main/resources/mybatis/mapper/fenxiao/ShopSalesmanApplyDao.xml
@@ -72,9 +72,9 @@ ( SELECT COUNT(*) FROM biz_user WHERE parent_open_id = a.user_id AND is_sales = 1 ) invitedNum, ( SELECT IFNULL(sum(IFNULL(amount, 0)), 0) FROM shop_salesman_order WHERE user_id = a.user_id AND order_status = 2 AND sales_user_id = a.user_id ) totalRevenue, WHERE order_status = 2 AND sales_user_id = a.user_id ) totalRevenue, ( SELECT IFNULL(sum(IFNULL(amount, 0)), 0) FROM shop_salesman_order WHERE user_id = a.user_id AND order_status = 1 AND sales_user_id = a.user_id ) balance, WHERE order_status = 1 AND sales_user_id = a.user_id ) balance, g.NAME grade, a.create_time createTime, a.apply_status applyStatus, zq-erp/src/main/resources/mybatis/mapper/fenxiao/ShopSalesmanGradeDao.xml
@@ -49,6 +49,7 @@ SELECT a.id id, a.name name, a.self_commission selfCommission, a.seales_commission sealesCommission, a.invitation_commission invitationCommission, a.grade_condition gradeCondition, zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopAdvertisDao.xml
@@ -20,6 +20,7 @@ <result property="linkType" column="link_type"/> <result property="linkUrl" column="link_url"/> <result property="companyId" column="company_id" /> <result property="pageId" column="page_id" /> </resultMap> @@ -38,6 +39,7 @@ <result property="remarks" column="remarks" /> <result property="linkType" column="link_type"/> <result property="linkUrl" column="link_url"/> <result property="pageId" column="page_id" /> <result property="companyId" column="company_id" /> </resultMap> @@ -56,6 +58,7 @@ remarks, link_type, link_url, page_id, company_id </sql> @@ -74,6 +77,7 @@ #{item.remarks}, #{item.linkType}, #{item.linkUrl}, #{item.pageId}, #{item.companyId} </sql> @@ -101,6 +105,9 @@ </if> <if test="(record.remarks!=null and record.remarks!='') or (record.remarks!='' and record.remarks==0) "> and remarks = #{record.remarks} </if> <if test="(record.pageId!=null and record.pageId!='') or (record.pageId!='' and record.pageId==0) "> and page_id = #{record.pageId} </if> <if test="record.companyId != null and record.companyId !='' "> and company_id = #{record.companyId} @@ -167,6 +174,10 @@ link_type = #{linkType}, </if> <if test="_parameter.containsKey('pageId')"> page_id = #{pageId}, </if> </set> WHERE id=#{id} @@ -206,6 +217,10 @@ company_id = #{record.companyId} </if> <if test="record.pageId != null and record.pageId !='' "> page_id = #{record.pageId} </if> </set> WHERE id=#{record.id} </update> @@ -232,8 +247,8 @@ <include refid="where_sql" ></include> </where> </delete> <!-- 分页查询 --> <select id="selectInPage" resultType="com.matrix.system.shopXcx.bean.ShopAdvertis"> @@ -249,6 +264,7 @@ ad.type_id typeId, ad.sort, ad.remarks, ad.page_id, IFNULL(adType.adt_name ,'无分类') adtName from shop_advertis ad left join shop_advertis_type adType zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopSkuDao.xml
@@ -22,6 +22,7 @@ <result property="sealCount" column="seal_count"/> <result property="stockCode" column="stock_code"/> <result property="shopId" column="shop_id"/> <result property="selfPrice" column="self_price"/> <result property="sealesPrice" column="seales_price"/> <result property="invitationPrice" column="invitation_price"/> <result property="scorePrice" column="score_price"/> @@ -50,6 +51,7 @@ <result property="sealCount" column="seal_count"/> <result property="stockCode" column="stock_code"/> <result property="shopId" column="shop_id"/> <result property="selfPrice" column="self_price"/> <result property="sealesPrice" column="seales_price"/> <result property="invitationPrice" column="invitation_price"/> <result property="scorePrice" column="score_price"/> @@ -75,6 +77,7 @@ seal_count, stock_code, shop_id, self_price, seales_price, invitation_price, score_price, @@ -102,6 +105,7 @@ #{item.sealCount}, #{item.stockCode}, #{item.shopId}, #{item.selfPrice}, #{item.sealesPrice}, #{item.invitationPrice}, #{item.scorePrice}, @@ -234,6 +238,10 @@ score_count = #{scoreCount}, </if> <if test="_parameter.containsKey('selfPrice')"> self_price = #{selfPrice}, </if> </set> WHERE id=#{id} @@ -293,6 +301,10 @@ score_count = #{record.scoreCount}, </if> <if test="record.selfPrice != null "> self_price = #{record.selfPrice}, </if> </set> WHERE id=#{record.id} zq-erp/src/main/resources/templates/views/admin/fenxiao/fenxiao-setting.html
@@ -39,6 +39,22 @@ <el-row style="margin-top: 20px;"> <el-col> <template v-for="paramSettingzgfy in zgfy"> <el-form-item> <span slot="label">{{paramSettingzgfy.paramName}}</span> <el-col> <el-radio-group v-model="paramSettingzgfy.paramValue"> <el-radio :label="'1'">是</el-radio> <el-radio :label="'2'">否</el-radio> </el-radio-group> </el-col> </el-form-item > </template> </el-col> </el-row> <el-row style="margin-top: 20px;"> <el-col> <template v-for="paramSettingTwo in fxms"> <el-form-item> <span slot="label">{{paramSettingTwo.paramName}}</span> @@ -287,6 +303,7 @@ sqfs:[], shfs:[], sqtj:[], zgfy:[], }, created: function () { this.loadInfo(); @@ -315,6 +332,7 @@ _this.fxkg = data.mapInfo.fxkg; _this.fxms = data.mapInfo.fxms; _this.sqfs = data.mapInfo.sqfs; _this.zgfy = data.mapInfo.zgfy; if(_this.sqfs.length > 0){ let paramssqfs = _this.sqfs[0].paramValue; if(paramssqfs == 2){ @@ -444,6 +462,21 @@ } submitDate.push(obj); } for (let i = 0; i < _this.zgfy.length; i++) { let paramSetting = _this.zgfy[i]; let paramCode = paramSetting.paramCode; let paramValue = paramSetting.paramValue; let paramValue1 = paramSetting.paramValue1; let paramValue2 = paramSetting.paramValue2; let obj = { paramCode: paramCode, paramValue: paramValue, paramValue1: paramValue1, paramValue2: paramValue2, } submitDate.push(obj); } for (let i = 0; i < _this.fxms.length; i++) { let paramSetting = _this.fxms[i]; let paramCode = paramSetting.paramCode; zq-erp/src/main/resources/templates/views/admin/fenxiao/fenxiao-user.html
@@ -199,6 +199,13 @@ </el-table-column> <el-table-column prop="sealesCommission" label="自购返佣 %"> <template slot-scope="scope"> <el-input class="edit-input" v-model="scope.row.selfCommission" oninput ="value=value.replace(/[^0-9.]/g,'')" placeholder="自购返佣"></el-input> </template> </el-table-column> <el-table-column prop="sealesCommission" label="推广提成 %"> <template slot-scope="scope"> <el-input class="edit-input" v-model="scope.row.sealesCommission" oninput ="value=value.replace(/[^0-9.]/g,'')" placeholder="推广提成"></el-input> @@ -474,12 +481,14 @@ let id = row.id; let name = row.name; let sealesCommission = row.sealesCommission; let selfCommission = row.selfCommission; let invitationCommission = row.invitationCommission; let gradeCondition = row.gradeCondition; let obj = { id: id, name: name, sealesCommission: sealesCommission, selfCommission: selfCommission, invitationCommission: invitationCommission, gradeCondition: gradeCondition, } zq-erp/src/main/resources/templates/views/admin/shop/shopAdvertisType-list.html
@@ -244,7 +244,7 @@ <el-table :data="currentNode.ads" :default-sort="{prop: '', order: 'descending'}" style="width: 100%" max-height="250"> style="width: 100%" > <el-table-column label="排序" zq-erp/src/main/resources/templates/views/admin/shop/shopProduct-form.html
@@ -221,6 +221,7 @@ <th>消费可得积分</th> <th>关联ERP产品</th> <th>排序</th> <th>自购返佣</th> <th>推广提成</th> <th>邀请提成</th> <th>兑换所需金额</th> @@ -353,6 +354,7 @@ <input autocomplete="off" type="hidden" class="form-control" name="erpGoodsCode"> </div></td> <td><input autocomplete="off" type="text" class="form-control" name=""></td> <td><input autocomplete="off" type="text" class="form-control" name=""></td> <td><input autocomplete="off" type="text" class="form-control" name=""></td> <td><input autocomplete="off" type="text" class="form-control" name=""></td> <td><input autocomplete="off" type="text" class="form-control" name=""></td> @@ -528,7 +530,10 @@ if (goodsName == null || typeof stockCode == 'undefined') { goodsName = ""; } var selfPrice = shopSkus[c].selfPrice; if (selfPrice == null || typeof selfPrice == 'undefined') { selfPrice = ""; } var sealesPrice = shopSkus[c].sealesPrice; if (sealesPrice == null || typeof sealesPrice == 'undefined') { sealesPrice = ""; @@ -559,6 +564,7 @@ +'<td><div id="erpNoDiv"><button class="btn btn-info" onclick="selectProduct(\'shopIdValue\',\''+trId+'\')"><i class="fa fa-plus"></i></button>' +'<p class="form-control-static erpGoodsName">'+ goodsName +'</p><input autocomplete="off" class="form-control" type="hidden" value="'+stockCode+'" name="erpGoodsCode"></div></td>' +'<td><input autocomplete="off" type="text" class="form-control" value="'+sort+'" name=""></td>' +'<td><input autocomplete="off" type="text" class="form-control" value="'+selfPrice+'" name=""></td>' +'<td><input autocomplete="off" type="text" class="form-control" value="'+sealesPrice+'" name=""></td>' +'<td><input autocomplete="off" type="text" class="form-control" value="'+invitationPrice+'" name=""></td>' +'<td><input autocomplete="off" type="text" class="form-control" value="'+scorePrice+'" name=""></td>' @@ -745,61 +751,63 @@ if (i != 0) { var tds = $(this).find("td"); var length = tds.length - 1; var id = tds.eq(length - 12).find("input").val(); var id = tds.eq(length - 13).find("input").val(); if(id == null){ id =""; } sku.id = id; //规格名称 var name = tds.eq(length - 11).find("input").val(); var name = tds.eq(length - 12).find("input").val(); if(name == null){ name = ""; } sku.name = name; //图片地址 var path = tds.eq(length - 10).find("img").attr("src"); var path = tds.eq(length - 11).find("img").attr("src"); if(path == null){ path = ""; } sku.imgPath = path; //库存 var stock = tds.eq(length - 9).find("input").val(); var stock = tds.eq(length - 10).find("input").val(); if(stock == ""){ stock = 0; } sku.stock = stock; //价格 var price = tds.eq(length -8).find("input").val(); var price = tds.eq(length -9).find("input").val(); if(price == ""){ price =0; } sku.price = price; //积分 var score = tds.eq(length - 7).find("input").val(); var score = tds.eq(length - 8).find("input").val(); if(score == ""){ score = 0; } sku.score = score; //品种编码 var stockCode = tds.eq(length - 6).find("input").val(); var stockCode = tds.eq(length - 7).find("input").val(); if(stockCode == null || typeof stockCode == 'undefined'){ stockCode = ''; } sku.stockCode = stockCode; //排序 var sort = tds.eq(length - 5).find("input").val(); var sort = tds.eq(length - 6).find("input").val(); if(sort == ""){ sort = 0; } sku.sort = sort; //推广提成 var selfPrice = tds.eq(length - 5).find("input").val(); sku.selfPrice = selfPrice; //推广提成 var sealesPrice = tds.eq(length - 4).find("input").val(); sku.sealesPrice = sealesPrice; @@ -838,20 +846,6 @@ var tds = $(this).find("td"); var length = tds.length - 1; if(ableSales==1){ //推广提成 var sealesPrice = tds.eq(length - 4).find("input").val(); //邀请提成 var invitationPrice = tds.eq(length - 3).find("input").val(); if(sealesPrice == ""||invitationPrice==""){ layer.msg("请填写推广提成和邀请提成",{ icon : 2, time : 2000 }); flag = true; return false; } } if(ableScorePay==1){ //兑换所需金额 @@ -868,7 +862,7 @@ } } var name = tds.eq(length - 11).find("input").val(); var name = tds.eq(length - 12).find("input").val(); if(name == ""){ layer.msg("请填写规格名称",{ icon : 2, @@ -886,7 +880,7 @@ return false; } var stock = tds.eq(length -9).find("input").val(); var stock = tds.eq(length -10).find("input").val(); if(stock == ""){ layer.msg("请填写库存",{ icon : 2, @@ -895,7 +889,7 @@ flag = true; return false; } var price = tds.eq(length - 8 ).find("input").val(); var price = tds.eq(length - 9 ).find("input").val(); if(price == ""){ layer.msg("请填写价格",{ icon : 2, zq-erp/src/test/java/com/matrix/SalesOrderTaskTest.java
New file @@ -0,0 +1,247 @@ package com.matrix; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.matrix.biz.bean.BizUser; import com.matrix.biz.service.BizUserService; import com.matrix.core.constance.MatrixConstance; import com.matrix.core.tools.LogUtil; import com.matrix.core.tools.StringUtils; import com.matrix.system.common.bean.BusParameterSettings; import com.matrix.system.common.dao.BusParameterSettingsDao; import com.matrix.system.fenxiao.constant.FenxiaoSettingConstant; import com.matrix.system.fenxiao.dao.ShopSalesmanGradeDao; import com.matrix.system.fenxiao.dao.ShopSalesmanOrderDao; import com.matrix.system.fenxiao.entity.ShopSalesmanGrade; import com.matrix.system.fenxiao.entity.ShopSalesmanOrder; import com.matrix.system.hive.dao.SysOrderDao; import com.matrix.system.hive.dao.SysOrderItemDao; import com.matrix.system.hive.dao.SysVipInfoDao; import com.matrix.system.hive.service.CodeService; import com.matrix.system.hive.service.ShoppingGoodsService; import com.matrix.system.hive.service.SysOrderService; import com.matrix.system.shopXcx.bean.ShopOrder; import com.matrix.system.shopXcx.bean.ShopOrderDetails; import com.matrix.system.shopXcx.bean.ShopProduct; import com.matrix.system.shopXcx.bean.ShopSku; import com.matrix.system.shopXcx.dao.ShopOrderDao; import com.matrix.system.shopXcx.dao.ShopOrderDetailsDao; import com.matrix.system.shopXcx.dao.ShopSkuDao; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; @RunWith(SpringRunner.class) @SpringBootTest(classes = {ZqErpApplication.class},webEnvironment =SpringBootTest.WebEnvironment.RANDOM_PORT) public class SalesOrderTaskTest { @Autowired ShopOrderDao shopOrderDao; @Autowired ShopOrderDetailsDao shopOrderDetailsDao; @Autowired BizUserService bizUserService; @Autowired SysVipInfoDao vipDap; @Autowired SysVipInfoDao vipDao; @Autowired CodeService codeService; @Autowired SysOrderDao sysOrderDao; @Autowired ShoppingGoodsService shoppingGoodsService; @Autowired SysOrderItemDao orderItemDao; @Autowired SysOrderService orderService; @Autowired ShopSkuDao shopSkuDao; @Autowired BusParameterSettingsDao parameterSettingsDao; @Autowired private ShopSalesmanOrderDao shopSalesmanOrderDao; @Autowired private ShopSalesmanGradeDao shopSalesmanGradeDao; /** * 处理分销订单 * @param order */ @Test public void handleExtensionOrder() { ShopOrder order = new ShopOrder(); order.setUserId("oJkRK4_pWN2kjp75B_G6oGSWawj0"); order.setId(1190); order.setCompanyId(36L); List<ShopOrderDetails> details = new ArrayList<ShopOrderDetails>(); ShopOrderDetails shopOrderDetails = new ShopOrderDetails(); shopOrderDetails.setTotalPrice(new BigDecimal(0.01)); ShopProduct shopProduct = new ShopProduct(); shopProduct.setAttrValues("测试"); shopProduct.setAbleSales(1); ShopSku shopSku = new ShopSku(); shopOrderDetails.setShopSku(shopSku); shopOrderDetails.setShopProduct(shopProduct); shopOrderDetails.setCount(1); details.add(shopOrderDetails); order.setDetails(details); order.setOrderMoney(new BigDecimal(0.01)); //判读客户是否存在上级,存在则产生上级的收益 BizUser bizUser = bizUserService.findByOpenId(order.getUserId()); LogUtil.debug("处理分销订单userOpid={}",bizUser.getOpenId()); //判断是否重复生成 QueryWrapper queryWrapper=new QueryWrapper(); queryWrapper.eq("order_id",order.getId()); Integer orderCount = shopSalesmanOrderDao.selectCount(queryWrapper); if(orderCount==0){ ShopSalesmanOrder salesmanOrder=new ShopSalesmanOrder(); salesmanOrder.setCompanyId(order.getCompanyId()); salesmanOrder.setCreateBy(MatrixConstance.SYSTEM_USER); salesmanOrder.setUpdateBy(MatrixConstance.SYSTEM_USER); salesmanOrder.setCreateTime(new Date()); salesmanOrder.setUpdateTime(new Date()); salesmanOrder.setOrderId(Long.parseLong(order.getId()+"")); salesmanOrder.setUserId(order.getUserId()); salesmanOrder.setRevenueType(ShopSalesmanOrder.REVENUE_TYPE_SALES); salesmanOrder.setOrderStatus(ShopSalesmanOrder.STATUS_DJS); Double selfAmount=0D; Double zk=1D; //分销订单总额 Double orderTotal=0D; for (ShopOrderDetails item:order.getDetails() ){ if(StringUtils.isNotBlank(item.getShopProduct().getAttrValues()) && item.getShopProduct().getAbleSales()==ShopProduct.ABLE_SALES){ orderTotal+=item.getTotalPrice().doubleValue(); } } //自购返佣 for (ShopOrderDetails item:order.getDetails() ){ if(StringUtils.isNotBlank(item.getShopProduct().getAttrValues()) && item.getShopProduct().getAbleSales()==ShopProduct.ABLE_SALES){ //分销规则是否开启自购返佣 BusParameterSettings zgfy = parameterSettingsDao.selectCompanyParamByCode(FenxiaoSettingConstant.FX_ZGFY, bizUser.getCompanyId()); //按分销等级计算 ShopSalesmanGrade shopSalesmanGrade = shopSalesmanGradeDao.selectById(bizUser.getSalesmanGrade()); if(ObjectUtil.isNotEmpty(zgfy)) { //获取商品的自购返佣价格,如果没有设置,在去获取当前推广人的等级的自购返佣比例 if(StrUtil.isNotEmpty(zgfy.getParamValue()) && FenxiaoSettingConstant.FX_ZGFY_YES.equals(zgfy.getParamValue())) { if(item.getShopSku().getSelfPrice() == null ||item.getShopSku().getSealesPrice().doubleValue() == 0){ selfAmount+=item.getTotalPrice().doubleValue()*(shopSalesmanGrade.getSelfCommission()/100); }else { //按产品设置的自购返佣金额计算 selfAmount+=item.getShopSku().getSelfPrice().doubleValue()*item.getCount(); } } } } } //自购返佣记录 if(selfAmount > 0) { //整体的优惠金额折算成折扣,* 佣金 zk=order.getOrderMoney().doubleValue()/orderTotal; selfAmount=selfAmount*zk; salesmanOrder.setAmount(selfAmount); salesmanOrder.setSalesUserId(order.getUserId()); shopSalesmanOrderDao.insert(salesmanOrder); } //存在上级 if(StringUtils.isNotBlank(bizUser.getParentOpenId())) { BizUser salesMan=bizUserService.findByOpenId(bizUser.getParentOpenId()); Double salesAmount=0D; Double invitationAmount=0D; BizUser invitationMan=null; ShopSalesmanOrder invitationOrder=null; boolean hasInvitationMan=StringUtils.isNotBlank(salesMan.getParentOpenId()); //判断推广员是否还存在上级,存在则计算邀请收益 if(hasInvitationMan){ invitationMan=bizUserService.findByOpenId(salesMan.getParentOpenId()); invitationOrder=new ShopSalesmanOrder(); BeanUtils.copyProperties(salesmanOrder,invitationOrder); invitationOrder.setSalesUserId(invitationMan.getOpenId()); invitationOrder.setRevenueType(ShopSalesmanOrder.REVENUE_TYPE_INVITATION); } //收益计算 for (ShopOrderDetails item:order.getDetails() ){ if(StringUtils.isNotBlank(item.getShopProduct().getAttrValues()) && item.getShopProduct().getAbleSales()==ShopProduct.ABLE_SALES){ //按分销等级计算 ShopSalesmanGrade shopSalesmanGrade = shopSalesmanGradeDao.selectById(salesMan.getSalesmanGrade()); //推广提成,按分销等级计算或者按产品设置的推广金额计算 if(item.getShopSku().getSealesPrice()==null ||item.getShopSku().getSealesPrice().doubleValue()==0){ salesAmount+=item.getTotalPrice().doubleValue()*(shopSalesmanGrade.getSealesCommission()/100); }else{ salesAmount+=item.getShopSku().getSealesPrice().doubleValue()*item.getCount(); } //邀请提成,获取商品的邀请提成价格和是否有上级推广人,如果没有设置,在去获取当前推广人的等级的自购返佣比例 if(hasInvitationMan) { if(item.getShopSku().getInvitationPrice() == null ||item.getShopSku().getInvitationPrice().doubleValue() == 0){ //获取上级的推广等级设置 ShopSalesmanGrade invitationManGrade = shopSalesmanGradeDao.selectById(invitationMan.getSalesmanGrade()); invitationAmount+=item.getTotalPrice().doubleValue()*(invitationManGrade.getInvitationCommission()/100); }else { //按产品设置的邀请提成价格计算 invitationAmount+=item.getShopSku().getInvitationPrice().doubleValue()*item.getCount(); } } } } //推广提成记录 if(salesAmount>0){ //整体的优惠金额折算成折扣,* 佣金 zk=order.getOrderMoney().doubleValue()/orderTotal; salesAmount=salesAmount*zk; salesmanOrder.setAmount(salesAmount); salesmanOrder.setSalesUserId(bizUser.getParentOpenId()); shopSalesmanOrderDao.insert(salesmanOrder); } //邀请提成记录 if(invitationAmount > 0) { //整体的优惠金额折算成折扣,* 佣金 invitationAmount=invitationAmount*zk; invitationOrder.setAmount(invitationAmount); shopSalesmanOrderDao.insert(invitationOrder); } }else{ LogUtil.debug("不存在父级userOpid={}",bizUser.getOpenId()); } }else{ LogUtil.debug("重复订单id={}",order.getId()); } } }