Helius
2021-03-12 0a16ffd3e627278bc317109ef7102f5673a1242d
Merge branch 'score_shop' of http://120.27.238.55:7000/r/beauty-erp into score_shop
6 files added
18 files modified
589 ■■■■■ changed files
zq-erp/pom.xml 4 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/biz/bean/BizUser.java 6 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/fenxiao/action/FenXiaoUserAction.java 52 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/fenxiao/dao/ShopSalesmanApplyDao.java 3 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/fenxiao/dao/ShopSalesmanGradeDao.java 6 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/fenxiao/dao/ShopSalesmanOrderItemDao.java 13 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/fenxiao/dto/AddSaleManApplyDto.java 20 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/fenxiao/dto/ShopSalesmanAppliingDto.java 2 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/fenxiao/entity/ShopSalesmanApply.java 3 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/fenxiao/entity/ShopSalesmanOrder.java 19 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/fenxiao/entity/ShopSalesmanOrderItem.java 54 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/fenxiao/service/ShopSalesmanApplyService.java 53 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/fenxiao/service/ShopSalesmanOrderItemService.java 20 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/fenxiao/vo/ShopSalesmanGradeVo.java 17 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxSalesmanAction.java 3 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java 106 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/config/db/increment/推广员.sql 23 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/config/test/application.properties 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/fenxiao/ShopSalesmanApplyDao.xml 30 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/fenxiao/ShopSalesmanGradeDao.xml 11 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/fenxiao/ShopSalesmanOrderItemDao.xml 33 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/fenxiao/fenxiao-apply.html 59 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/fenxiao/fenxiao-user.html 3 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/shop/shopProduct-form.html 47 ●●●● patch | view | raw | blame | history
zq-erp/pom.xml
@@ -394,12 +394,12 @@
                    <exclude>config/test/*</exclude>
                    <exclude>config/xcx/*</exclude>
                    <!---->
                    <!--
                    <exclude>config/config.json</exclude>
                    <exclude>config/application.properties</exclude>
                    <exclude>config/system.properties</exclude>
-->
                    <exclude>**/*.woff</exclude>
                    <exclude>**/*.woff2</exclude>
zq-erp/src/main/java/com/matrix/biz/bean/BizUser.java
@@ -43,7 +43,7 @@
    /**
     *推广员等级
     */
    private Double  salesmanGrade;
    private Long  salesmanGrade;
    /**
@@ -265,11 +265,11 @@
        this.withdrawalCash = withdrawalCash;
    }
    public Double getSalesmanGrade() {
    public Long getSalesmanGrade() {
        return salesmanGrade;
    }
    public void setSalesmanGrade(Double salesmanGrade) {
    public void setSalesmanGrade(Long salesmanGrade) {
        this.salesmanGrade = salesmanGrade;
    }
zq-erp/src/main/java/com/matrix/system/fenxiao/action/FenXiaoUserAction.java
@@ -2,19 +2,26 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.matrix.core.constance.MatrixConstance;
import com.matrix.core.pojo.AjaxResult;
import com.matrix.core.tools.StringUtils;
import com.matrix.core.tools.WebUtil;
import com.matrix.system.common.bean.SysUsers;
import com.matrix.system.fenxiao.dto.AddSaleManApplyDto;
import com.matrix.system.fenxiao.dto.ShopSalesmanAppliingDto;
import com.matrix.system.fenxiao.dto.ShopSalesmanApplyDto;
import com.matrix.system.fenxiao.service.ShopSalesmanApplyService;
import com.matrix.system.fenxiao.vo.ShopSalesmanAppliingVo;
import com.matrix.system.fenxiao.vo.ShopSalesmanApplyVo;
import com.matrix.system.fenxiao.vo.ShopSalesmanGradeVo;
import com.matrix.system.hive.action.util.QueryUtil;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping(value = "/fenXiao/fenXiaoUser")
@@ -41,23 +48,12 @@
            shopSalesmanApplyDto.setOrder("desc");
        }
        
        Page<ShopSalesmanApplyVo> page = new Page(shopSalesmanApplyDto.getPageNum(), shopSalesmanApplyDto.getPageSize());
        IPage<ShopSalesmanApplyVo> rows = shopSalesmanApplyService.findShopSalesmanApplyList(page,shopSalesmanApplyDto);
        AjaxResult result = AjaxResult.buildSuccessInstance(rows.getRecords(),rows.getTotal());
        return result;
    }
    /**
     * 跳转 分销员待审核记录页面
     *
    @RequestMapping(value = "/shopSalesmanAppliing")
    public String shopSalesmanAppliing() {
        return "admin/fenxiao/fenxiao-apply";
    }
     */
    
    /**
     *获取分销员待审核记录
@@ -71,8 +67,6 @@
    AjaxResult findShopSalesmanAppliingList(@RequestBody ShopSalesmanAppliingDto shopSalesmanAppliingDto) {
        //设置用户公司ID
        QueryUtil.setQueryLimitCom(shopSalesmanAppliingDto);
        //查询条件待审核状态
        shopSalesmanAppliingDto.setApplyStatus(1);
        //排序
        if(StringUtils.isBlank(shopSalesmanAppliingDto.getSort())){
            shopSalesmanAppliingDto.setSort("create_time");
@@ -80,9 +74,39 @@
        }
        Page<ShopSalesmanAppliingVo> page = new Page(shopSalesmanAppliingDto.getPageNum(), shopSalesmanAppliingDto.getPageSize());
        IPage<ShopSalesmanAppliingVo> rows = shopSalesmanApplyService.findShopSalesmanAppliingList(page,shopSalesmanAppliingDto);
        IPage<ShopSalesmanAppliingVo> rows = shopSalesmanApplyService.selectBizUserApplyList(page,shopSalesmanAppliingDto);
        //IPage<ShopSalesmanAppliingVo> rows = shopSalesmanApplyService.findShopSalesmanAppliingList(page,shopSalesmanAppliingDto);
        AjaxResult result = AjaxResult.buildSuccessInstance(rows.getRecords(),rows.getTotal());
        return result;
    }
    /**
     *获取对应的分销员等级
     */
    @RequestMapping(value = "/getShopSalesmanGrade")
    private @ResponseBody AjaxResult getShopSalesmanGradeVo(){
        AjaxResult result= AjaxResult.buildSuccessInstance("查询成功");
        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        List<ShopSalesmanGradeVo> dataList = shopSalesmanApplyService.getShopSalesmanGradeVo(user.getCompanyId());
        result.putInMap("salesGrade", dataList);
        return result;
    }
    /**
     *新增分销员
     */
    @ApiOperation(value = "新增分销员")
    @PostMapping(value = "/addSaleManApply")
    public @ResponseBody
    AjaxResult findShopSalesmanAppliingList(@RequestBody AddSaleManApplyDto addSaleManApplyDto) {
        //设置用户公司ID
        QueryUtil.setQueryLimitCom(addSaleManApplyDto);
        AjaxResult result= AjaxResult.buildSuccessInstance("设置成功");
        shopSalesmanApplyService.addSaleManApply(addSaleManApplyDto.getUserId(),addSaleManApplyDto.getGradeId());
        return result;
    }
}
zq-erp/src/main/java/com/matrix/system/fenxiao/dao/ShopSalesmanApplyDao.java
@@ -28,4 +28,7 @@
    IPage<ShopSalesmanAppliingVo> findShopSalesmanAppliingList(Page<ShopSalesmanAppliingVo> page,
            @Param("record")ShopSalesmanAppliingDto shopSalesmanAppliingDto);
    IPage<ShopSalesmanAppliingVo> selectBizUserApplyList(Page<ShopSalesmanAppliingVo> page,
            @Param("record")ShopSalesmanAppliingDto shopSalesmanAppliingDto);
}
zq-erp/src/main/java/com/matrix/system/fenxiao/dao/ShopSalesmanGradeDao.java
@@ -2,6 +2,10 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.matrix.system.fenxiao.entity.ShopSalesmanGrade;
import com.matrix.system.fenxiao.vo.ShopSalesmanGradeVo;
import io.lettuce.core.dynamic.annotation.Param;
import java.util.List;
/**
 * @description 推广员等级
@@ -10,4 +14,6 @@
 */
public interface ShopSalesmanGradeDao extends BaseMapper<ShopSalesmanGrade> {
    List<ShopSalesmanGradeVo> getShopSalesmanGradeVo(@Param("companyId")Long companyId);
}
zq-erp/src/main/java/com/matrix/system/fenxiao/dao/ShopSalesmanOrderItemDao.java
New file
@@ -0,0 +1,13 @@
package com.matrix.system.fenxiao.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.matrix.system.fenxiao.entity.ShopSalesmanOrderItem;
/**
 * @description 分销单明细
 * @author yourName
 * @date 2021-03-12 13:17
 */
public interface ShopSalesmanOrderItemDao extends BaseMapper<ShopSalesmanOrderItem> {
}
zq-erp/src/main/java/com/matrix/system/fenxiao/dto/AddSaleManApplyDto.java
New file
@@ -0,0 +1,20 @@
package com.matrix.system.fenxiao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "AddSaleManApplyDto", description = "查询参数")
public class AddSaleManApplyDto {
    @ApiModelProperty(value ="会员ID")
    private String userId;
    @ApiModelProperty(value ="等级ID")
    private String gradeId;
    @ApiModelProperty(hidden = true)
    private Long companyId;
}
zq-erp/src/main/java/com/matrix/system/fenxiao/dto/ShopSalesmanAppliingDto.java
@@ -15,8 +15,6 @@
    
    @ApiModelProperty(hidden = true)
    private Long companyId;
    @ApiModelProperty(hidden = true)
    private Integer applyStatus;
    
}
zq-erp/src/main/java/com/matrix/system/fenxiao/entity/ShopSalesmanApply.java
@@ -63,6 +63,9 @@
    @ApiModelProperty(value = "备注")
    private String  remark;
    
    @ApiModelProperty(value = "等级ID")
    private long  gradeId;
    /**
     * 公司ID
     */
zq-erp/src/main/java/com/matrix/system/fenxiao/entity/ShopSalesmanOrder.java
@@ -13,6 +13,25 @@
@Data
@TableName("shop_salesman_order")
public class ShopSalesmanOrder  extends BaseEntity {
    /**
     * 推广收益类型1推广收益
     */
    public static final Integer REVENUE_TYPE_SALES = 1;
    /**
     * 推广收益类型2邀请收益
     */
    public static final Integer REVENUE_TYPE_INVITATION = 2;
    /**
     * 分销单状态1待结算
     */
    public static final Integer STATUS_DJS = 1;
    /**
     * 分销单状态2已结算
     */
    public static final Integer STATUS_YJS = 2;
    @Extend
    private static final long serialVersionUID = 1L; 
zq-erp/src/main/java/com/matrix/system/fenxiao/entity/ShopSalesmanOrderItem.java
New file
@@ -0,0 +1,54 @@
package com.matrix.system.fenxiao.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.matrix.core.anotations.Extend;
import com.matrix.system.score.entity.BaseEntity;
import lombok.Data;
/**
 * @description 分销单明细
 * @author yourName
 * @date 2021-03-12 13:17
 */
@Data
@TableName("shop_salesman_order_item")
public class ShopSalesmanOrderItem  extends BaseEntity {
    @Extend
    private static final long serialVersionUID = 1L;
    /**
     * 订单id
     */
    private Long  orderId ;
    /**
     * 分销订单id
     */
    private Long  salesmanOrderId;
    /**
     * 订单明细id
     */
    private Long  orderItemId;
    /**
     * 收益金额
     */
    private Double  amount;
}
zq-erp/src/main/java/com/matrix/system/fenxiao/service/ShopSalesmanApplyService.java
@@ -1,5 +1,6 @@
package com.matrix.system.fenxiao.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -11,18 +12,21 @@
import com.matrix.core.tools.StringUtils;
import com.matrix.system.common.bean.BusParameterSettings;
import com.matrix.system.common.dao.BusParameterSettingsDao;
import com.matrix.system.common.interceptor.HostInterceptor;
import com.matrix.system.fenxiao.constant.FenxiaoSettingConstant;
import com.matrix.system.fenxiao.dao.ShopSalesmanApplyDao;
import com.matrix.system.fenxiao.dao.ShopSalesmanGradeDao;
import com.matrix.system.fenxiao.dto.ShopSalesmanAppliingDto;
import com.matrix.system.fenxiao.dto.ShopSalesmanApplyDto;
import com.matrix.system.fenxiao.entity.ShopSalesmanApply;
import com.matrix.system.fenxiao.entity.ShopSalesmanGrade;
import com.matrix.system.fenxiao.vo.ShopSalesmanAppliingVo;
import com.matrix.system.fenxiao.vo.ShopSalesmanApplyVo;
import com.matrix.system.fenxiao.vo.ShopSalesmanGradeVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
 * @description 推广员申请记录
@@ -38,6 +42,9 @@
    @Autowired
    ShopSalesmanApplyDao salesmanApplyDao;
    @Autowired
    ShopSalesmanGradeDao shopSalesmanGradeDao;
    @Autowired
    private BizUserDao bizUserDao;
@@ -51,7 +58,7 @@
     * @param invitationId
     * @return
     */
    public ShopSalesmanApply applyToBeAnSalesman(String openId, String invitationId) {
    public ShopSalesmanApply applyToBeAnSalesman(String openId,String gradeId,String invitationId) {
        BizUser loginUser=bizUserDao.findByOpenId(openId);
        //校验审核状态,和是否重复发起
@@ -63,6 +70,7 @@
            ShopSalesmanApply shopSalesmanApply=new ShopSalesmanApply();
            shopSalesmanApply.setUserId(openId);
            shopSalesmanApply.setCreateBy(loginUser.getNickName());
            shopSalesmanApply.setApplyWay(ShopSalesmanApply.APPLY_WAY_SELF);
@@ -78,8 +86,18 @@
                //如果曾经是被邀请进来的则自动绑定为之前邀请人的下级
                shopSalesmanApply.setParentUserId(loginUser.getParentOpenId());
            }
            if(StringUtils.isNotBlank(gradeId)){
                shopSalesmanApply.setGradeId(Long.parseLong(gradeId));
            }else{
                //获取初始等级ID(公司id,是否为初始等级)
                Wrapper<ShopSalesmanGrade> queryWrapperOrepool = new QueryWrapper<>();
                ((QueryWrapper<ShopSalesmanGrade>) queryWrapperOrepool).eq("company_id", loginUser.getCompanyId());
                ((QueryWrapper<ShopSalesmanGrade>) queryWrapperOrepool).eq("is_default", 1);
                ShopSalesmanGrade shopSalesmanGrade = shopSalesmanGradeDao.selectOne(queryWrapperOrepool);
                shopSalesmanApply.setGradeId(shopSalesmanGrade.getId());
            }
            BusParameterSettings busParameterSettings = busParameterSettingsDao.selectCompanyParamByCode(FenxiaoSettingConstant.FX_AUDIT_METHOD, HostInterceptor.getCompanyId());
            BusParameterSettings busParameterSettings = busParameterSettingsDao.selectCompanyParamByCode(FenxiaoSettingConstant.FX_AUDIT_METHOD, loginUser.getCompanyId());
            if(busParameterSettings!=null
                    &&busParameterSettings.getParamValue().equals("1")){
                //自动审核
@@ -106,4 +124,33 @@
        return salesmanApplyDao.findShopSalesmanAppliingList(page,shopSalesmanAppliingDto);
    }
    public IPage<ShopSalesmanAppliingVo> selectBizUserApplyList(Page<ShopSalesmanAppliingVo> page, ShopSalesmanAppliingDto shopSalesmanAppliingDto) {
        return salesmanApplyDao.selectBizUserApplyList(page,shopSalesmanAppliingDto);
    }
    public List<ShopSalesmanGradeVo> getShopSalesmanGradeVo(Long companyId) {
        return shopSalesmanGradeDao.getShopSalesmanGradeVo(companyId);
    }
    public void addSaleManApply(String userId,String gradeId) {
        BizUser user = bizUserDao.selectById(userId);
        applyToBeAnSalesman(user.getOpenId(),gradeId, "");
    }
}
zq-erp/src/main/java/com/matrix/system/fenxiao/service/ShopSalesmanOrderItemService.java
New file
@@ -0,0 +1,20 @@
package com.matrix.system.fenxiao.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.matrix.system.fenxiao.dao.ShopSalesmanOrderItemDao;
import com.matrix.system.fenxiao.entity.ShopSalesmanOrderItem;
import org.springframework.stereotype.Service;
/**
 * @description 分销单明细
 * @author yourName
 * @date 2021-03-12 13:17
 */
@Service
public class ShopSalesmanOrderItemService  extends ServiceImpl<ShopSalesmanOrderItemDao, ShopSalesmanOrderItem>{
}
zq-erp/src/main/java/com/matrix/system/fenxiao/vo/ShopSalesmanGradeVo.java
New file
@@ -0,0 +1,17 @@
package com.matrix.system.fenxiao.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "ShopSalesmanGradeVo", description = "返参")
public class ShopSalesmanGradeVo {
    @ApiModelProperty(value = "id")
    private Long id;
    @ApiModelProperty(value = "等级名称")
    private String  name;
}
zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxSalesmanAction.java
@@ -54,6 +54,7 @@
    @Autowired
    ShopSalesmanApplyDao salesmanApplyDao;
    @Autowired
    ShopSalesmanApplyService shopSalesmanApplyService;
@@ -84,7 +85,7 @@
    public AjaxResult applyToBeAnSalesman(@RequestBody Map<String,String> param) {
        BizUser loginUser = redisUserLoginUtils.getLoginUser(BizUser.class);
        String invitationId = param.get("invitationId");
        ShopSalesmanApply shopSalesmanApply= shopSalesmanApplyService.applyToBeAnSalesman(loginUser.getOpenId(),invitationId);
        ShopSalesmanApply shopSalesmanApply= shopSalesmanApplyService.applyToBeAnSalesman(loginUser.getOpenId(),"",invitationId);
        loginUser=bizUserDao.selectById(loginUser.getUserId());
        redisUserLoginUtils.updateUserInfo(loginUser);
        return AjaxResult.buildSuccessInstance(shopSalesmanApply);
zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java
@@ -3,11 +3,16 @@
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.constance.AppConstance;
import com.matrix.system.common.dao.BusParameterSettingsDao;
import com.matrix.system.constance.Dictionary;
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.bean.*;
import com.matrix.system.hive.dao.*;
import com.matrix.system.hive.service.CodeService;
@@ -21,6 +26,7 @@
import com.matrix.system.shopXcx.dao.ShopSkuDao;
import com.rabbitmq.client.DeliverCallback;
import com.rabbitmq.client.Delivery;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@@ -78,8 +84,15 @@
    @Autowired
    private ShoppingGoodsDao shoppingGoodsDao;
    @Autowired
    private ShopSalesmanOrderDao shopSalesmanOrderDao;
    @Autowired
    private ShopSalesmanGradeDao shopSalesmanGradeDao;
    @Transactional(rollbackFor = Exception.class)
    public void createOrder(ShopOrder orderDto) {
    public void synchronizationOrderToErp(ShopOrder orderDto) {
        //判断是否存在需要同步的产品,只有绑定了erp中产品的才同步
        boolean needTb=false;
        for (ShopOrderDetails orderItemDto : orderDto.getDetails()) {
@@ -236,7 +249,96 @@
        //获取订单详情
        List<ShopOrderDetails> orderDetails = shopOrderDetailsDao.selectByOrderId(Integer.valueOf(orderId));
        order.setDetails(orderDetails);
        createOrder(order);
        //同步订单到erp
        synchronizationOrderToErp(order);
        //处理分销订单
        handleExtensionOrder(order);
    }
    /**
     * 处理分销订单
     * @param order
     */
    @Transactional
    void handleExtensionOrder(ShopOrder order) {
        //判读客户是否存在上级,存在则产生上级的收益
        BizUser bizUser = bizUserService.findByOpenId(order.getUserId());
        if(StringUtils.isNotBlank(bizUser.getParentOpenId())){
            LogUtil.debug("处理分销订单userOpid={}",bizUser.getOpenId());
            //存在上级
            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);
            }
            //收益计算
            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.getSealesCommission()/100);
                        }
                    }else{
                        //按产品设置的推广金额计算
                        salesAmount+=item.getShopSku().getSealesPrice().doubleValue()*item.getCount();
                        if(hasInvitationMan){
                            invitationAmount+=item.getShopSku().getInvitationPrice().doubleValue()*item.getCount();
                        }
                    }
                    orderTotal+=item.getTotalPrice().doubleValue();
                }
            }
            //整体的优惠金额折算成折扣,* 佣金
            zk=order.getOrderMoney().doubleValue()/orderTotal;
            salesAmount=salesAmount*zk;
            salesmanOrder.setAmount(salesAmount);
            shopSalesmanOrderDao.insert(salesmanOrder);
            if(hasInvitationMan){
                invitationAmount=invitationAmount*zk;
                invitationOrder.setAmount(invitationAmount);
                shopSalesmanOrderDao.insert(invitationOrder);
            }
        }else{
            LogUtil.debug("不存在父级userOpid={}",bizUser.getOpenId());
        }
    }
}
zq-erp/src/main/resources/config/db/increment/推广员.sql
@@ -11,6 +11,29 @@
/**
 * 分销单明细
 * @author yourName
 * @date 2021-03-12 13:17
 */
CREATE TABLE shop_salesman_order_item(
                                         create_by varchar(100) NOT NULL COMMENT '创建人',
                                         create_time datetime NOT NULL COMMENT '创建时间',
                                         update_by varchar(100) NOT NULL COMMENT '更新人',
                                         update_time datetime NOT NULL COMMENT '更新时间',
                                         id bigint(20)   NOT NULL  AUTO_INCREMENT  COMMENT '主键',
                                         order_id  bigint(20)    COMMENT '订单id',
                                         salesman_order_id bigint(20)    COMMENT '分销订单id',
                                         order_item_id bigint(20)    COMMENT '订单明细id',
                                         amount double(20,2)    COMMENT '收益金额',
PRIMARY KEY(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分销单明细';
/**
 * 收益流水
 * @author yourName
 * @date 2021-03-10 17:34
zq-erp/src/main/resources/config/test/application.properties
@@ -65,7 +65,7 @@
#定时任务
scheduling.enabled=false
swagger.enable=false
swagger.enable=true
swagger.security.username=admin
swagger.security.password=admin
zq-erp/src/main/resources/mybatis/mapper/fenxiao/ShopSalesmanApplyDao.xml
@@ -46,7 +46,9 @@
                    shop_salesman_order b
                WHERE
                    b.user_id = a.open_id
                  and order_status=2
                  AND b.sales_user_id = #{openId}
            ) AS revenueAmount,
            ( SELECT count( * ) FROM shop_salesman_order c WHERE c.user_id = a.open_id AND c.sales_user_id = #{openId} ) AS orderCount
        FROM
@@ -58,13 +60,15 @@
    <select id="findShopSalesmanApplyList" resultType="com.matrix.system.fenxiao.vo.ShopSalesmanApplyVo">
        SELECT
        a.user_id userId
        a.user_id userId,
        b.nick_name nickname,
        (SELECT s.nick_name from biz_user s where s.user_id = a.parent_user_id) parentUser,
        FROM
        shop_salesman_apply a
        LEFT JOIN biz_user b ON a.user_id = b.user_id
        LEFT JOIN shop_salesman_grade g ON b.salesman_grade = g.id
        <where>
            and a.company_id=#{record.companyId}
             a.company_id=#{record.companyId}
            <if test="record.shenheState != null and record.shenheState != ''">
                and a.apply_status=#{record.shenheState}
            </if>
@@ -82,7 +86,7 @@
        shop_salesman_apply a
        LEFT JOIN biz_user b ON a.user_id = b.user_id
        <where>
            and a.company_id = #{record.companyId}
            a.company_id = #{record.companyId}
            and a.apply_status = #{record.applyStatus}
            <if test="record.nickName != null and record.nickName != ''">
                and b.nick_name like concat('%',#{record.nickName},'%')
@@ -93,5 +97,25 @@
            a.${record.sort} ${record.order}
        </if>
    </select>
    <select id="selectBizUserApplyList" resultType="com.matrix.system.fenxiao.vo.ShopSalesmanAppliingVo">
        SELECT
        a.user_id userId,
        a.nick_name nickName
        FROM
        biz_user a
        LEFT JOIN shop_salesman_apply b ON a.user_id = b.user_id
        <where>
            a.company_id = #{record.companyId}
            and a.is_sales != 1
            and b.apply_status != 1
            <if test="record.nickName != null and record.nickName != ''">
                and a.nick_name like concat('%',#{record.nickName},'%')
            </if>
        </where>
        <if test="record.sort !=null">
            order by
            a.${record.sort} ${record.order}
        </if>
    </select>
</mapper>
zq-erp/src/main/resources/mybatis/mapper/fenxiao/ShopSalesmanGradeDao.xml
@@ -34,4 +34,15 @@
            <result property="companyId" column="company_id" />
    </resultMap>
    <select id="getShopSalesmanGradeVo" resultType="com.matrix.system.fenxiao.vo.ShopSalesmanGradeVo">
        SELECT
        a.id,
        a.name
        FROM
        shop_salesman_grade a
        where
        a.company_id = #{companyId}
    </select>
</mapper>
zq-erp/src/main/resources/mybatis/mapper/fenxiao/ShopSalesmanOrderItemDao.xml
New file
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.matrix.system.fenxiao.dao.ShopSalesmanOrderItemDao">
    <!-- 定义ShopSalesmanOrderItem 的复杂关联map -->
    <resultMap type="com.matrix.system.fenxiao.entity.ShopSalesmanOrderItem" id="ShopSalesmanOrderItemMap">
        <id property="id" column="id" />
        <result property="createBy" column="create_by" />
        <result property="createTime" column="create_time" />
        <result property="updateBy" column="update_by" />
        <result property="updateTime" column="update_time" />
            <result property="orderId " column="order_id " />
            <result property="salesmanOrderId" column="salesman_order_id" />
            <result property="orderItemId" column="order_item_id" />
            <result property="amount" column="amount" />
    </resultMap>
    <!-- 定义ShopSalesmanOrderItem 的简单map  ,本map不添加其他的关联属性 -->
    <resultMap type="com.matrix.system.fenxiao.entity.ShopSalesmanOrderItem" id="ShopSalesmanOrderItemSimpleMap">
        <id property="id" column="id" />
        <result property="createBy" column="create_by" />
        <result property="createTime" column="create_time" />
        <result property="updateBy" column="update_by" />
        <result property="updateTime" column="update_time" />
            <result property="orderId " column="order_id " />
            <result property="salesmanOrderId" column="salesman_order_id" />
            <result property="orderItemId" column="order_item_id" />
            <result property="amount" column="amount" />
    </resultMap>
</mapper>
zq-erp/src/main/resources/templates/views/admin/fenxiao/fenxiao-apply.html
@@ -18,12 +18,6 @@
        .panel-body{
            overflow: hidden;
        }
        .rowPanel{
            background: #ffffff;
            padding: 0px 10px ;
            padding-top: 10px;
            margin: 0px 0px 10px 0px;
        }
        .paginationStyle{
            background: #ffffff;
            padding: 10px 10px;
@@ -34,7 +28,7 @@
</head>
<body>
<div class="panel-body" id="app">
    <el-row class="rowPanel"  >
    <el-row style="display:flex;align-items: center;">
        <el-form ref="form" :model="form" inline >
            <el-form-item prop="nickName">
                <el-input v-model="form.nickName" placeholder="请输入会员姓名"></el-input>
@@ -50,17 +44,28 @@
        <el-table id="proj" :data="table.rows"  :height="height" stripe @sort-change="sortChange">
            <el-table-column
                    prop="userId"
                    label="订单号"
                    width="180">
                    label=""
                    width="300">
            </el-table-column>
            <el-table-column
                    prop="nickname"
                    label="分销员昵称"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="salesGrade"
                    label="分销等级"
                    width="180">
                <template slot-scope="scope">
                    <el-select v-model="scope.row.proJbruserValue"  @focus="getDatalist(scope.row)" placeholder="请选择" filterable allow-create>
                        <el-option v-for="item in salesGradeList " :key="item.id" :label="item.name" :value="item.id">
                        </el-option>
                    </el-select>
                </template>
            </el-table-column>
            <el-table-column label="操作">
                <template slot-scope="scope">
                    <el-button type="text" size="small">设置为分销员</el-button>
                    <el-button type="text" size="small" @click="addSaleManApply(scope.row)">设置为分销员</el-button>
                </template>
            </el-table-column>
        </el-table>
@@ -102,6 +107,8 @@
                order:'',
                sort:''
            },
            proJbruserValue : "",
            salesGradeList: [],
            height:'calc(100vh - 240px)',
        },
        created: function () {
@@ -109,6 +116,38 @@
            window.addEventListener("keydown", this.keydown);
        },
        methods: {
            //设置为分销员
            addSaleManApply(row){
                let _this = this;
                let userId = row.userId;
                let gradeId = row.proJbruserValue;
                alert(gradeId);
                let obj = {
                    userId: userId,
                    gradeId: gradeId,
                }
                AjaxProxy.requst({
                    app: _this,
                    data:obj,
                    url: basePath + '/fenXiao/fenXiaoUser/addSaleManApply',
                    callback: function (data) {
                        _this.$message.success(data.info);
                        this.loadData();
                    }
                });
            },
            // select下拉框获取焦点的时候查询对应的下拉框数据源
            getDatalist(row) {
                let _this = this;
                AjaxProxy.requst({
                    app: _this,
                    data:[],
                    url: basePath + '/fenXiao/fenXiaoUser/getShopSalesmanGrade',
                    callback: function (data) {
                        _this.salesGradeList = data.mapInfo.salesGrade;
                    }
                });
            },
            changePageSize(val) {
                this.table.pageSize = val;
                this.loadData();
zq-erp/src/main/resources/templates/views/admin/fenxiao/fenxiao-user.html
@@ -74,8 +74,9 @@
                                <el-table-column
                                        fixed="right"
                                        label="操作"
                                        width="100">
                                        width="auto">
                                    <template slot-scope="scope">
                                        <el-button type="text" size="small" @click="addSaleManApply(scope.row)">审核</el-button>
                                        <el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>
                                        <el-button type="text" size="small">编辑</el-button>
                                    </template>
zq-erp/src/main/resources/templates/views/admin/shop/shopProduct-form.html
@@ -229,6 +229,8 @@
                                    <th>积分</th>
                                    <th>关联ERP产品</th>
                                    <th>排序</th>
                                    <th>推广提成</th>
                                    <th>邀请提成</th>
                                    <th>操作</th>
                                </tr>
                            </table>
@@ -357,6 +359,8 @@
        <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><i class="fa fa-trash form-control-static" onclick="delThis('trId')"></i></td>
    </tr>
</script>
@@ -526,6 +530,16 @@
                goodsName = "";
            }
            var sealesPrice = shopSkus[c].sealesPrice;
            if (sealesPrice == null || typeof sealesPrice == 'undefined') {
                sealesPrice = "";
            }
            var invitationPrice = shopSkus[c].invitationPrice;
            if (invitationPrice == null || typeof invitationPrice == 'undefined') {
                invitationPrice = "";
            }
            var html=
                '<tr id="'+trId+'">'
                +'<td style="display:none;"><input autocomplete="off"   type="hidden" class="form-control" value="'+shopSkus[c].id+'" ></td>'
@@ -538,6 +552,8 @@
                +'<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="'+sealesPrice+'" name=""></td>'
                +'<td><input autocomplete="off"   type="text" class="form-control"  value="'+invitationPrice+'" name=""></td>'
                +'<td><i class="fa fa-trash form-control-static"    onclick="delThis(\''+trId+'\')"></i></td>'
                +'</tr>';
            $("#skutable").find("tbody").append(html);
@@ -617,7 +633,7 @@
    //初始化属性下拉选
    function initAttrSeclect(seler, def) {
        $.AjaxProxy().invoke(basePath + "/admin/shopProductAttribute/showSonAttribute?attrCode=service",
        $.AjaxProxy().invoke(basePath + "/admin/shopProductAttribute/showSonAttribute?attrCode=productColumn",
            function (loj) {
                $(seler).createSelectTree(
                    loj.attr("result").rows,
@@ -708,61 +724,68 @@
            if (i != 0) {
                var tds = $(this).find("td");
                var length = tds.length - 1;
                var id = tds.eq(length - 8).find("input").val();
                var id = tds.eq(length - 10).find("input").val();
                if(id == null){
                    id ="";
                }
                sku.id = id;
                //规格名称
                var name = tds.eq(length - 7).find("input").val();
                var name = tds.eq(length - 9).find("input").val();
                if(name == null){
                    name = "";
                }
                sku.name = name;
                //图片地址
                var path = tds.eq(length - 6).find("img").attr("src");
                var path = tds.eq(length - 8).find("img").attr("src");
                if(path == null){
                    path = "";
                }
                sku.imgPath = path;
                //库存
                var stock = tds.eq(length - 5).find("input").val();
                var stock = tds.eq(length - 7).find("input").val();
                if(stock == ""){
                    stock = 0;
                }
                sku.stock = stock;
                //价格
                var price = tds.eq(length - 4).find("input").val();
                var price = tds.eq(length -6).find("input").val();
                if(price == ""){
                    price =0;
                }
                sku.price = price;
                //积分
                var score = tds.eq(length - 3).find("input").val();
                var score = tds.eq(length - 5).find("input").val();
                if(score == ""){
                    score = 0;
                }
                sku.score = score;
                //品种编码
                var stockCode = tds.eq(length - 2).find("input").val();
                var stockCode = tds.eq(length - 4).find("input").val();
                if(stockCode == null || typeof stockCode == 'undefined'){
                    stockCode = '';
                }
                sku.stockCode = stockCode;
                //排序
                var sort = tds.eq(length - 1).find("input").val();
                var sort = tds.eq(length - 3).find("input").val();
                if(sort == ""){
                    sort = 0;
                }
                sku.sort = sort;
                //推广提成
                var sealesPrice = tds.eq(length - 2).find("input").val();
                sku.sealesPrice = sealesPrice;
                //邀请提成
                var invitationPrice = tds.eq(length - 1).find("input").val();
                sku.invitationPrice = invitationPrice;
                skus.push(sku);
            }
@@ -780,7 +803,7 @@
            if (i != 0) {
                var tds = $(this).find("td");
                var length = tds.length - 1;
                var name = tds.eq(length - 7).find("input").val();
                var name = tds.eq(length - 9).find("input").val();
                if(name == ""){
                    layer.msg("请填写规格名称",{
                        icon : 2,
@@ -798,7 +821,7 @@
                    return false;
                }
                var stock = tds.eq(length - 5).find("input").val();
                var stock = tds.eq(length -7).find("input").val();
                if(stock == ""){
                    layer.msg("请填写库存",{
                        icon : 2,
@@ -807,7 +830,7 @@
                    flag = true;
                    return false;
                }
                var price = tds.eq(length - 4).find("input").val();
                var price = tds.eq(length - 6).find("input").val();
                if(price == ""){
                    layer.msg("请填写价格",{
                        icon : 2,