Просмотр исходного кода

产品价格列表(作废、删除、批量作废、批量删除、导出)
产品调价列表(新增、编辑、审批、删除、批量审核、批量删除、导入、导入模板、导出)
钱包列表(新增、编辑)
销售类型(新增、编辑)
返利类型(新增、编辑)
经销商钱包对应关系(新增、删除、批量删除、导入、导入模板、导出)

FengChaoYu 18 часов назад
Родитель
Сommit
4343265159
17 измененных файлов с 1523 добавлено и 0 удалено
  1. 48 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/config/CompanyWalletVO.java
  2. 30 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/config/RebateTypeVO.java
  3. 40 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/config/SalesTypeVO.java
  4. 30 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/config/WalletVO.java
  5. 19 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/price/ProductPriceUpdateBean.java
  6. 123 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/price/ProductPriceUpdateVO.java
  7. 97 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/price/ProductPriceVO.java
  8. 54 0
      mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/CommonMapper.java
  9. 179 0
      mall-server-api/src/main/java/com/gree/mall/manager/controller/supply/sales/config/SupplyPayConfigController.java
  10. 75 0
      mall-server-api/src/main/java/com/gree/mall/manager/controller/supply/sales/price/ProductPriceController.java
  11. 147 0
      mall-server-api/src/main/java/com/gree/mall/manager/controller/supply/sales/price/ProductPriceUpdateController.java
  12. 229 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/supply/sales/config/SupplyPayConfigLogic.java
  13. 58 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/supply/sales/price/ProductPriceLogic.java
  14. 325 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/supply/sales/price/ProductPriceUpdateLogic.java
  15. 69 0
      mall-server-api/src/main/resources/mapper/CommonMapper.xml
  16. BIN
      mall-server-api/src/main/resources/template/调价单模板.xlsx
  17. BIN
      mall-server-api/src/main/resources/template/钱包对应关系模板.xlsx

+ 48 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/config/CompanyWalletVO.java

@@ -0,0 +1,48 @@
+package com.gree.mall.manager.bean.supply.sales.config;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel
+@ZfireField(tbName = "a")
+public class CompanyWalletVO {
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "商户id")
+    private String companyWechatId;
+
+    @ZfireField(tbName = "c")
+    @ApiModelProperty(value = "商户编号")
+    private String corpId;
+
+    @ZfireField(tbName = "c")
+    @ApiModelProperty(value = "商户名称")
+    private String companyName;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "钱包id")
+    private String walletId;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "钱包编码")
+    private String code;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "钱包名称")
+    private String name;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+}

+ 30 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/config/RebateTypeVO.java

@@ -0,0 +1,30 @@
+package com.gree.mall.manager.bean.supply.sales.config;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel
+@ZfireField(tbName = "a")
+public class RebateTypeVO {
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    @ApiModelProperty(value = "返利编码")
+    private String code;
+
+    @ApiModelProperty(value = "返利类型")
+    private String name;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+}

+ 40 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/config/SalesTypeVO.java

@@ -0,0 +1,40 @@
+package com.gree.mall.manager.bean.supply.sales.config;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.StatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel
+@ZfireField(tbName = "a")
+public class SalesTypeVO {
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    @ApiModelProperty(value = "销售类型编码")
+    private String code;
+
+    @ApiModelProperty(value = "销售类型名称")
+    private String name;
+
+    @ApiModelProperty(value = "状态")
+    private StatusEnum status;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "修改人")
+    private String updateBy;
+
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+}

+ 30 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/config/WalletVO.java

@@ -0,0 +1,30 @@
+package com.gree.mall.manager.bean.supply.sales.config;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel
+@ZfireField(tbName = "a")
+public class WalletVO {
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    @ApiModelProperty(value = "钱包编码")
+    private String code;
+
+    @ApiModelProperty(value = "钱包名称")
+    private String name;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+}

+ 19 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/price/ProductPriceUpdateBean.java

@@ -0,0 +1,19 @@
+package com.gree.mall.manager.bean.supply.sales.price;
+
+import com.gree.mall.manager.plus.entity.ProductPriceUpdate;
+import com.gree.mall.manager.plus.entity.ProductPriceUpdateItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel
+public class ProductPriceUpdateBean extends ProductPriceUpdate {
+
+    @ApiModelProperty(value = "明细")
+    private List<ProductPriceUpdateItem> items;
+}

+ 123 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/price/ProductPriceUpdateVO.java

@@ -0,0 +1,123 @@
+package com.gree.mall.manager.bean.supply.sales.price;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.ExamineStatusEnum;
+import com.gree.mall.manager.enums.material.UnitEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel
+@ZfireField(tbName = "a")
+public class ProductPriceUpdateVO {
+    @ApiModelProperty(value = "单号")
+    private String id;
+
+    @ApiModelProperty(value = "状态")
+    private ExamineStatusEnum examineStatus;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "销售类型编码")
+    private String salesTypeCode;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "销售类型名称")
+    private String salesTypeName;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "厂物料编码")
+    private String factoryNo;
+
+    @ZfireField(hide = true, tbName = "b")
+    @ApiModelProperty(value = "产品大类id")
+    private String mainId;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "产品大类名称")
+    private String mainName;
+
+    @ZfireField(hide = true, tbName = "b")
+    @ApiModelProperty(value = "产品小类")
+    private String smallId;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "产品小类名称")
+    private String smallName;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "商品名称")
+    private String goodsMaterialName;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "系统名称")
+    private String seriesName;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "规格型号")
+    private String specsName;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "单位")
+    private UnitEnum unit;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "单价")
+    private BigDecimal price;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "开始日期")
+    private Date startDate;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "结束日期")
+    private Date endDate;
+
+    @ZfireField(hide = true, tbName = "b")
+    @ApiModelProperty(value = "返利类型id(多选逗号隔开)")
+    private String rebateTypeId;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "返利类型编码")
+    private String rebateTypeCode;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "返利类型名称")
+    private String rebateTypeName;
+
+    @ZfireField(hide = true, tbName = "b")
+    @ApiModelProperty(value = "钱包id(多选逗号隔开)")
+    private String walletId;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "钱包编码")
+    private String walletCode;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "钱包名称")
+    private String walletName;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "修改人")
+    private String updateBy;
+
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "审核人")
+    private String examineBy;
+
+    @ApiModelProperty(value = "审核时间")
+    private Date examineTime;
+}

+ 97 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/supply/sales/price/ProductPriceVO.java

@@ -0,0 +1,97 @@
+package com.gree.mall.manager.bean.supply.sales.price;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.material.StateEnum;
+import com.gree.mall.manager.enums.material.UnitEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel
+@ZfireField(tbName = "a")
+public class ProductPriceVO {
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    @ApiModelProperty(value = "销售类型编码")
+    private String salesTypeCode;
+
+    @ApiModelProperty(value = "销售类型名称")
+    private String salesTypeName;
+
+    @ApiModelProperty(value = "厂物料编码")
+    private String factoryNo;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "产品大类id")
+    private String mainId;
+
+    @ApiModelProperty(value = "产品大类名称")
+    private String mainName;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "产品小类")
+    private String smallId;
+
+    @ApiModelProperty(value = "产品小类名称")
+    private String smallName;
+
+    @ApiModelProperty(value = "商品物料id")
+    private String goodsMaterialId;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodsMaterialName;
+
+    @ApiModelProperty(value = "系统名称")
+    private String seriesName;
+
+    @ApiModelProperty(value = "规格型号")
+    private String specsName;
+
+    @ApiModelProperty(value = "单位")
+    private UnitEnum unit;
+
+    @ApiModelProperty(value = "单价")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "开始日期")
+    private Date startDate;
+
+    @ApiModelProperty(value = "结束日期")
+    private Date endDate;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "返利类型id(多选逗号隔开)")
+    private String rebateTypeId;
+
+    @ApiModelProperty(value = "返利类型名称")
+    private String rebateTypeName;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "钱包id(多选逗号隔开)")
+    private String walletId;
+
+    @ApiModelProperty(value = "钱包名称")
+    private String walletName;
+
+    @ApiModelProperty(value = "状态")
+    private StateEnum status;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "修改人")
+    private String updateBy;
+
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+
+}

+ 54 - 0
mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/CommonMapper.java

@@ -26,6 +26,12 @@ import com.gree.mall.manager.bean.settle.SettleExpenseVO;
 import com.gree.mall.manager.bean.settle.SettleMonthWagesVO;
 import com.gree.mall.manager.bean.settle.SettleMonthWagesVO;
 import com.gree.mall.manager.bean.settle.SettleMonthWagesWorkerVO;
 import com.gree.mall.manager.bean.settle.SettleMonthWagesWorkerVO;
 import com.gree.mall.manager.bean.settle.repair.*;
 import com.gree.mall.manager.bean.settle.repair.*;
+import com.gree.mall.manager.bean.supply.sales.config.CompanyWalletVO;
+import com.gree.mall.manager.bean.supply.sales.config.RebateTypeVO;
+import com.gree.mall.manager.bean.supply.sales.config.SalesTypeVO;
+import com.gree.mall.manager.bean.supply.sales.config.WalletVO;
+import com.gree.mall.manager.bean.supply.sales.price.ProductPriceUpdateVO;
+import com.gree.mall.manager.bean.supply.sales.price.ProductPriceVO;
 import com.gree.mall.manager.bean.user.*;
 import com.gree.mall.manager.bean.user.*;
 import com.gree.mall.manager.bean.workorder.*;
 import com.gree.mall.manager.bean.workorder.*;
 import com.gree.mall.manager.enums.UserTypeEnum;
 import com.gree.mall.manager.enums.UserTypeEnum;
@@ -689,4 +695,52 @@ public interface CommonMapper {
      * @return
      * @return
      */
      */
     IPage<TrainingVO> trainingPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
     IPage<TrainingVO> trainingPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 产品价格列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<ProductPriceVO> productPriceList(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 产品价格列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<ProductPriceUpdateVO> productPriceUpdateList(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 销售类型列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<SalesTypeVO> salesTypeList(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 钱包列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<WalletVO> walletList(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 返利类型列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<RebateTypeVO> rebateTypeList(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 商户供应链钱包列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<CompanyWalletVO> companyWalletList(Page page, @Param("ex") ZfireParamBean zfireParamBean);
 }
 }

+ 179 - 0
mall-server-api/src/main/java/com/gree/mall/manager/controller/supply/sales/config/SupplyPayConfigController.java

@@ -0,0 +1,179 @@
+package com.gree.mall.manager.controller.supply.sales.config;
+
+import cn.hutool.core.lang.TypeReference;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.gree.mall.manager.annotation.ZfireList;
+import com.gree.mall.manager.bean.supply.sales.config.CompanyWalletVO;
+import com.gree.mall.manager.bean.supply.sales.config.RebateTypeVO;
+import com.gree.mall.manager.bean.supply.sales.config.SalesTypeVO;
+import com.gree.mall.manager.bean.supply.sales.config.WalletVO;
+import com.gree.mall.manager.constant.Constant;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.helper.ResponseHelper;
+import com.gree.mall.manager.logic.supply.sales.config.SupplyPayConfigLogic;
+import com.gree.mall.manager.plus.entity.AdminCompanyWechatWallet;
+import com.gree.mall.manager.plus.entity.RebateType;
+import com.gree.mall.manager.plus.entity.SalesType;
+import com.gree.mall.manager.plus.entity.Wallet;
+import com.gree.mall.manager.utils.excel.ExcelUtils;
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.integration.redis.util.RedisLockRegistry;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+
+@Slf4j
+@RestController
+@Api(value = "供应链支付配置API", tags = {"供应链支付配置API"})
+@RequestMapping(value = "/supply/sales/config", produces = "application/json; charset=utf-8")
+public class SupplyPayConfigController {
+
+    @Resource
+    SupplyPayConfigLogic supplyPayConfigLogic;
+    @Resource
+    RedisLockRegistry redisLockRegistry;
+
+    @ZfireList
+    @PostMapping("/type/list")
+    @ApiOperation(value = "销售类型列表")
+    public ResponseHelper<IPage<SalesTypeVO>> typeList(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) {
+        IPage<SalesTypeVO> page = supplyPayConfigLogic.typeList(zfireParamBean);
+        return ResponseHelper.success(page, new TypeReference<SalesTypeVO>() {
+        });
+    }
+
+    @PostMapping("/type/detail")
+    @ApiOperation(value = "销售类型详情")
+    public ResponseHelper<SalesType> typeDetail(
+            @ApiParam(value = "id", required = true) @RequestParam String id
+    ) throws Exception {
+        SalesType detail = supplyPayConfigLogic.typeDetail(id);
+        return ResponseHelper.success(detail);
+    }
+
+    @PostMapping("/type/save")
+    @ApiOperation(value = "销售类型新增/编辑")
+    public ResponseHelper save(
+            @RequestBody SalesType salesType
+    ) throws Exception {
+        supplyPayConfigLogic.typeSave(salesType);
+
+        return ResponseHelper.success();
+    }
+
+    @ZfireList
+    @PostMapping("/wallet/list")
+    @ApiOperation(value = "钱包列表")
+    public ResponseHelper<IPage<WalletVO>> walletList(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) {
+        IPage<WalletVO> page = supplyPayConfigLogic.walletList(zfireParamBean);
+        return ResponseHelper.success(page, new TypeReference<WalletVO>() {
+        });
+    }
+
+    @PostMapping("/wallet/add")
+    @ApiOperation(value = "钱包新增")
+    public ResponseHelper walletAdd(
+            @RequestBody Wallet wallet
+    ) throws Exception {
+        supplyPayConfigLogic.walletAdd(wallet);
+
+        return ResponseHelper.success();
+    }
+
+    @ZfireList
+    @PostMapping("/rebate/type/list")
+    @ApiOperation(value = "返利类型列表")
+    public ResponseHelper<IPage<RebateTypeVO>> rebateTypeList(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) {
+        IPage<RebateTypeVO> page = supplyPayConfigLogic.rebateTypeList(zfireParamBean);
+        return ResponseHelper.success(page, new TypeReference<RebateTypeVO>() {
+        });
+    }
+
+    @PostMapping("/rebate/type/add")
+    @ApiOperation(value = "返利类型新增")
+    public ResponseHelper rebateTypeAdd(
+            @RequestBody RebateType rebateType
+    ) throws Exception {
+        supplyPayConfigLogic.rebateTypeAdd(rebateType);
+
+        return ResponseHelper.success();
+    }
+
+    @ZfireList
+    @PostMapping("/company/wallet/list")
+    @ApiOperation(value = "商户供应链钱包列表")
+    public ResponseHelper<IPage<CompanyWalletVO>> companyWalletList(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) {
+        IPage<CompanyWalletVO> page = supplyPayConfigLogic.companyWalletList(zfireParamBean);
+        return ResponseHelper.success(page, new TypeReference<CompanyWalletVO>() {
+        });
+    }
+
+    @PostMapping("/company/wallet/list/export")
+    @ApiOperation(value = "商户供应链钱包导出")
+    public void companyWalletListExport(@RequestBody ZfireParamBean zfireParamBean, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        //2.查询要导出的内容
+        IPage<CompanyWalletVO> page = supplyPayConfigLogic.companyWalletList(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(page.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+
+    @PostMapping("/company/wallet/add")
+    @ApiOperation(value = "商户供应链钱包新增")
+    public ResponseHelper companyWalletAdd(
+            @RequestBody AdminCompanyWechatWallet adminCompanyWechatWallet
+    ) throws Exception {
+        supplyPayConfigLogic.companyWalletAdd(adminCompanyWechatWallet);
+
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/company/wallet/batch/del")
+    @ApiOperation(value = "商户供应链钱包批量删除")
+    public ResponseHelper companyWalletBatchDel(
+            @RequestBody List<String> ids
+    ) throws Exception {
+        supplyPayConfigLogic.companyWalletBatchDel(ids);
+
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/company/wallet/import")
+    @ApiOperation("导入(下载模板:钱包对应关系模板.xlsx)")
+    public ResponseHelper<Integer> companyWalletImportData(
+            @ApiParam(value = "附件", required = true) @RequestPart("file") MultipartFile file,
+            HttpServletRequest request
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_ORDER + ":companyWallet");
+        int num = 0;
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
+        try {
+            List<Object> objects = ExcelUtils.importExcel(file);
+            num = supplyPayConfigLogic.companyWalletImportData(objects);
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success(num);
+    }
+}

+ 75 - 0
mall-server-api/src/main/java/com/gree/mall/manager/controller/supply/sales/price/ProductPriceController.java

@@ -0,0 +1,75 @@
+package com.gree.mall.manager.controller.supply.sales.price;
+
+import cn.hutool.core.lang.TypeReference;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.gree.mall.manager.annotation.ZfireList;
+import com.gree.mall.manager.bean.supply.sales.price.ProductPriceVO;
+import com.gree.mall.manager.helper.ResponseHelper;
+import com.gree.mall.manager.logic.supply.sales.price.ProductPriceLogic;
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.integration.redis.util.RedisLockRegistry;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+@Slf4j
+@RestController
+@Api(value = "产品价格列表", tags = {"产品价格列表"})
+@RequestMapping(value = "/supply/product/price", produces = "application/json; charset=utf-8")
+public class ProductPriceController {
+
+    @Resource
+    ProductPriceLogic productPriceLogic;
+    @Resource
+    RedisLockRegistry redisLockRegistry;
+
+    @ZfireList
+    @PostMapping("/list")
+    @ApiOperation(value = " 列表")
+    public ResponseHelper<IPage<ProductPriceVO>> list(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) {
+        IPage<ProductPriceVO> page = productPriceLogic.list(zfireParamBean);
+        return ResponseHelper.success(page, new TypeReference<ProductPriceVO>() {
+        });
+    }
+
+    @PostMapping("/list/export")
+    @ApiOperation(value = "导出")
+    public void listExport(@RequestBody ZfireParamBean zfireParamBean, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        //2.查询要导出的内容
+        IPage<ProductPriceVO> page = productPriceLogic.list(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(page.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+
+    @PostMapping("/batch/cancel")
+    @ApiOperation(value = "批量作废")
+    public ResponseHelper batchCancel(
+            @RequestBody List<String> ids
+    ) throws Exception {
+        productPriceLogic.batchCancel(ids);
+
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/batch/del")
+    @ApiOperation(value = "批量删除")
+    public ResponseHelper batchDel(
+            @RequestBody List<String> ids
+    ) throws Exception {
+        productPriceLogic.batchDel(ids);
+
+        return ResponseHelper.success();
+    }
+}

+ 147 - 0
mall-server-api/src/main/java/com/gree/mall/manager/controller/supply/sales/price/ProductPriceUpdateController.java

@@ -0,0 +1,147 @@
+package com.gree.mall.manager.controller.supply.sales.price;
+
+import cn.hutool.core.lang.TypeReference;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.gree.mall.manager.annotation.ZfireList;
+import com.gree.mall.manager.bean.supply.sales.price.ProductPriceUpdateBean;
+import com.gree.mall.manager.bean.supply.sales.price.ProductPriceUpdateVO;
+import com.gree.mall.manager.constant.Constant;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.helper.ResponseHelper;
+import com.gree.mall.manager.logic.supply.sales.price.ProductPriceUpdateLogic;
+import com.gree.mall.manager.utils.excel.ExcelUtils;
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.integration.redis.util.RedisLockRegistry;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+
+@Slf4j
+@RestController
+@Api(value = "产品调价列表", tags = {"产品调价列表"})
+@RequestMapping(value = "/supply/product/price/update", produces = "application/json; charset=utf-8")
+public class ProductPriceUpdateController {
+
+    @Resource
+    ProductPriceUpdateLogic productPriceUpdateLogic;
+    @Resource
+    RedisLockRegistry redisLockRegistry;
+
+    @ZfireList
+    @PostMapping("/list")
+    @ApiOperation(value = " 列表")
+    public ResponseHelper<IPage<ProductPriceUpdateVO>> list(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) {
+        IPage<ProductPriceUpdateVO> page = productPriceUpdateLogic.list(zfireParamBean);
+        return ResponseHelper.success(page, new TypeReference<ProductPriceUpdateVO>() {
+        });
+    }
+
+    @PostMapping("/list/export")
+    @ApiOperation(value = "导出")
+    public void listExport(@RequestBody ZfireParamBean zfireParamBean, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        //2.查询要导出的内容
+        IPage<ProductPriceUpdateVO> page = productPriceUpdateLogic.list(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(page.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+
+    @PostMapping("/detail")
+    @ApiOperation(value = "详情")
+    public ResponseHelper<ProductPriceUpdateBean> detail(
+            @ApiParam(value = "id", required = true) @RequestParam String id
+    ) throws Exception {
+        ProductPriceUpdateBean detail = productPriceUpdateLogic.detail(id);
+        return ResponseHelper.success(detail);
+    }
+
+    @PostMapping("/save")
+    @ApiOperation(value = "新增/编辑")
+    public ResponseHelper save(
+            @RequestBody ProductPriceUpdateBean bean
+    ) throws Exception {
+        productPriceUpdateLogic.save(bean);
+
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/batch/examine")
+    @ApiOperation(value = "批量审核")
+    public ResponseHelper batchExamine(
+            @RequestBody List<String> ids
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_ORDER + ":0");
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
+        try {
+            productPriceUpdateLogic.batchExamine(ids);
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/batch/fail")
+    @ApiOperation(value = "批量驳回")
+    public ResponseHelper batchFail(
+            @RequestBody List<String> ids
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_ORDER + ":0");
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
+        try {
+            productPriceUpdateLogic.batchFail(ids);
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/batch/del")
+    @ApiOperation(value = "批量删除")
+    public ResponseHelper batchDel(
+            @RequestBody List<String> ids
+    ) throws Exception {
+        productPriceUpdateLogic.batchDel(ids);
+
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/import")
+    @ApiOperation("导入(下载模板:调价单模板.xlsx)")
+    public ResponseHelper<Integer> importData(
+            @ApiParam(value = "备注") @RequestParam(required = false) String remark,
+            @ApiParam(value = "附件", required = true) @RequestPart("file") MultipartFile file,
+            HttpServletRequest request
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_ORDER + ":priceUpdate");
+        int num = 0;
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
+        try {
+            List<Object> objects = ExcelUtils.importExcel(file);
+            num = productPriceUpdateLogic.importData(objects, remark);
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success(num);
+    }
+}

+ 229 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/supply/sales/config/SupplyPayConfigLogic.java

@@ -0,0 +1,229 @@
+package com.gree.mall.manager.logic.supply.sales.config;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.manager.bean.admin.AdminUserCom;
+import com.gree.mall.manager.bean.supply.sales.config.CompanyWalletVO;
+import com.gree.mall.manager.bean.supply.sales.config.RebateTypeVO;
+import com.gree.mall.manager.bean.supply.sales.config.SalesTypeVO;
+import com.gree.mall.manager.bean.supply.sales.config.WalletVO;
+import com.gree.mall.manager.commonmapper.CommonMapper;
+import com.gree.mall.manager.enums.StatusEnum;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.logic.common.CommonLogic;
+import com.gree.mall.manager.plus.entity.*;
+import com.gree.mall.manager.plus.service.*;
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class SupplyPayConfigLogic {
+
+    private final CommonLogic commonLogic;
+    private final CommonMapper commonMapper;
+    private final SalesTypeService salesTypeService;
+    private final WalletService walletService;
+    private final RebateTypeService rebateTypeService;
+    private final AdminCompanyWechatWalletService adminCompanyWechatWalletService;
+    private final AdminCompanyWechatService adminCompanyWechatService;
+
+    public IPage<SalesTypeVO> typeList(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.platformParam(zfireParamBean, SalesTypeVO.class, adminUser);
+
+        return commonMapper.salesTypeList(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    public SalesType typeDetail(String id) {
+        return salesTypeService.getById(id);
+    }
+
+    @Transactional
+    public void typeSave(SalesType salesType) {
+        if (StringUtils.isBlank(salesType.getCode())) {
+            throw new RemoteServiceException("销售类型编码不能为空, 请检查!");
+        }
+        if (StringUtils.isBlank(salesType.getName())) {
+            throw new RemoteServiceException("销售类型名称不能为空, 请检查!");
+        }
+        salesType.setCode(StringUtils.trim(salesType.getCode()));
+        salesType.setName(StringUtils.trim(salesType.getName()));
+        final Integer count = salesTypeService.lambdaQuery()
+                .eq(SalesType::getCode, salesType.getCode())
+                .ne(StringUtils.isNotBlank(salesType.getId()), SalesType::getId, salesType.getId())
+                .count();
+        if (count > 0) {
+            throw new RemoteServiceException("销售类型编码存在重复, 请检查!");
+        }
+        if (StringUtils.isBlank(salesType.getId())) {
+            salesType.setId(IdWorker.getIdStr());
+            if (Objects.isNull(salesType.getStatus())) {
+                salesType.setStatus(StatusEnum.ONE.getValue());
+            }
+        }
+        salesType.setCompanyWechatId("0");
+
+        salesType.insertOrUpdate();
+    }
+
+    public IPage<WalletVO> walletList(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.platformParam(zfireParamBean, WalletVO.class, adminUser);
+
+        return commonMapper.walletList(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    @Transactional
+    public void walletAdd(Wallet wallet) {
+        if (StringUtils.isBlank(wallet.getCode())) {
+            throw new RemoteServiceException("钱包编码不能为空, 请检查!");
+        }
+        if (StringUtils.isBlank(wallet.getName())) {
+            throw new RemoteServiceException("钱包名称不能为空, 请检查!");
+        }
+        wallet.setCode(StringUtils.trim(wallet.getCode()));
+        wallet.setName(StringUtils.trim(wallet.getName()));
+        final Integer count = walletService.lambdaQuery()
+                .eq(Wallet::getCode, wallet.getCode())
+                .count();
+        if (count > 0) {
+            throw new RemoteServiceException("钱包编码存在重复, 请检查!");
+        }
+        wallet.setId(IdWorker.getIdStr());
+        wallet.setCompanyWechatId("0");
+        wallet.insert();
+    }
+
+    public IPage<RebateTypeVO> rebateTypeList(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.platformParam(zfireParamBean, RebateTypeVO.class, adminUser);
+
+        return commonMapper.rebateTypeList(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    @Transactional
+    public void rebateTypeAdd(RebateType rebateType) {
+        if (StringUtils.isBlank(rebateType.getCode())) {
+            throw new RemoteServiceException("返利编码不能为空, 请检查!");
+        }
+        if (StringUtils.isBlank(rebateType.getName())) {
+            throw new RemoteServiceException("返利类型不能为空, 请检查!");
+        }
+        rebateType.setCode(StringUtils.trim(rebateType.getCode()));
+        rebateType.setName(StringUtils.trim(rebateType.getName()));
+        final Integer count = rebateTypeService.lambdaQuery()
+                .eq(RebateType::getName, rebateType.getName())
+                .count();
+        if (count > 0) {
+            throw new RemoteServiceException("返利类型存在重复, 请检查!");
+        }
+        rebateType.setId(IdWorker.getIdStr());
+        rebateType.setCompanyWechatId("0");
+        rebateType.insert();
+    }
+
+    public IPage<CompanyWalletVO> companyWalletList(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.supplyParam(zfireParamBean, RebateTypeVO.class, adminUser);
+
+        return commonMapper.companyWalletList(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    @Transactional
+    public void companyWalletAdd(AdminCompanyWechatWallet adminCompanyWechatWallet) {
+        if (StringUtils.isBlank(adminCompanyWechatWallet.getCompanyWechatId())) {
+            throw new RemoteServiceException("商户不能为空, 请检查!");
+        }
+        if (StringUtils.isBlank(adminCompanyWechatWallet.getWalletId())) {
+            throw new RemoteServiceException("钱包不能为空, 请检查!");
+        }
+
+        final Integer count = adminCompanyWechatWalletService.lambdaQuery()
+                .eq(AdminCompanyWechatWallet::getCompanyWechatId, adminCompanyWechatWallet.getCompanyWechatId())
+                .eq(AdminCompanyWechatWallet::getWalletId, adminCompanyWechatWallet.getWalletId())
+                .count();
+        if (count > 0) {
+            throw new RemoteServiceException("商户与钱包关系已存在重复, 请检查!");
+        }
+        adminCompanyWechatWallet.setId(IdWorker.getIdStr());
+        adminCompanyWechatWallet.insert();
+    }
+
+    @Transactional
+    public void companyWalletBatchDel(List<String> ids) {
+        adminCompanyWechatWalletService.removeByIds(ids);
+    }
+
+    @Transactional
+    public int companyWalletImportData(List<Object> objects) {
+        //所有商户
+        List<AdminCompanyWechat> adminCompanyWechatList = adminCompanyWechatService.list();
+        Map<String, AdminCompanyWechat> companyWechatMap = adminCompanyWechatList.stream().collect(Collectors.toMap(AdminCompanyWechat::getCorpId, v -> v));
+
+        //查询所有现金钱包
+        List<Wallet> wallets = walletService.list();
+        Map<String, Wallet> walletMap = wallets.stream().collect(Collectors.toMap(Wallet::getCode, v -> v));
+
+        List<AdminCompanyWechatWallet> resultList = new ArrayList<>();
+        Set<String> set = new HashSet<>();
+
+        int index = 2;
+        for(Object o : objects){
+            List<Object> row = (List<Object>)o;
+            String companyCode = (String)row.get(0);
+
+            String walletCode = (String)row.get(1);
+
+            if (StringUtils.isEmpty(companyCode) || StringUtils.isEmpty(walletCode)) {
+                throw new RemoteServiceException("第" + index + "行, 检测到商户编码/钱包编码有为空的情况");
+            }
+
+            if (!companyWechatMap.containsKey(companyCode)) {
+                throw new RemoteServiceException("第" + index + "行, 商户编码不存在");
+            }
+
+            if (!walletMap.containsKey(walletCode)) {
+                throw new RemoteServiceException("第" + index + "行, 钱包编码不存在");
+            }
+
+
+            AdminCompanyWechatWallet item = new AdminCompanyWechatWallet();
+            item.setCompanyWechatId(companyWechatMap.get(StrUtil.trim(companyCode)).getCompanyWechatId());
+            item.setWalletId(walletMap.get(StrUtil.trim(walletCode)).getId());
+
+            if (set.contains(item.getCompanyWechatId() + item.getWalletId())) {
+                throw new RemoteServiceException("第" + index + "行, 发现导入文件有重复的商户编码和钱包编码");
+            }
+
+            final Integer count = adminCompanyWechatWalletService.lambdaQuery()
+                    .eq(AdminCompanyWechatWallet::getCompanyWechatId, item.getCompanyWechatId())
+                    .eq(AdminCompanyWechatWallet::getWalletId, item.getWalletId())
+                    .count();
+            if (count > 0) {
+                throw new RemoteServiceException("第" + index + "行, 商户与钱包关系已存在重复, 请检查!");
+            }
+
+
+            set.add(item.getCompanyWechatId() + item.getWalletId());
+            resultList.add(item);
+
+            index++;
+        }
+
+        adminCompanyWechatWalletService.saveBatch(resultList);
+
+        return resultList.size();
+    }
+}

+ 58 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/supply/sales/price/ProductPriceLogic.java

@@ -0,0 +1,58 @@
+package com.gree.mall.manager.logic.supply.sales.price;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.manager.bean.admin.AdminUserCom;
+import com.gree.mall.manager.bean.supply.sales.price.ProductPriceVO;
+import com.gree.mall.manager.commonmapper.CommonMapper;
+import com.gree.mall.manager.enums.material.StateEnum;
+import com.gree.mall.manager.logic.common.CommonLogic;
+import com.gree.mall.manager.plus.entity.ProductPrice;
+import com.gree.mall.manager.plus.service.ProductPriceService;
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class ProductPriceLogic {
+
+    private final CommonLogic commonLogic;
+    private final CommonMapper commonMapper;
+    private final ProductPriceService productPriceService;
+
+    public IPage<ProductPriceVO> list(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.platformParam(zfireParamBean, ProductPriceVO.class, adminUser);
+
+        return commonMapper.productPriceList(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    public void batchCancel(List<String> ids) {
+        final AdminUserCom adminUser = commonLogic.getAdminUser();
+        productPriceService.lambdaUpdate()
+                .set(ProductPrice::getStatus, StateEnum.OFF.getKey())
+                .set(ProductPrice::getUpdateBy, adminUser.getNickName())
+                .set(ProductPrice::getUpdateTime, DateUtil.date())
+                .in(ProductPrice::getId, ids)
+                .update();
+    }
+
+    public void batchDel(List<String> ids) {
+        final AdminUserCom adminUser = commonLogic.getAdminUser();
+        productPriceService.lambdaUpdate()
+                .set(ProductPrice::getDel, true)
+                .set(ProductPrice::getUpdateBy, adminUser.getNickName())
+                .set(ProductPrice::getUpdateTime, DateUtil.date())
+                .in(ProductPrice::getId, ids)
+                .eq(ProductPrice::getStatus, StateEnum.OFF.getKey())
+                .update();
+    }
+
+}

+ 325 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/supply/sales/price/ProductPriceUpdateLogic.java

@@ -0,0 +1,325 @@
+package com.gree.mall.manager.logic.supply.sales.price;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.manager.bean.admin.AdminUserCom;
+import com.gree.mall.manager.bean.supply.sales.price.ProductPriceUpdateBean;
+import com.gree.mall.manager.bean.supply.sales.price.ProductPriceUpdateVO;
+import com.gree.mall.manager.commonmapper.CommonMapper;
+import com.gree.mall.manager.enums.ExamineStatusEnum;
+import com.gree.mall.manager.enums.material.StateEnum;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.logic.common.CommonLogic;
+import com.gree.mall.manager.plus.entity.*;
+import com.gree.mall.manager.plus.service.*;
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.client.utils.DateUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class ProductPriceUpdateLogic {
+
+    private final CommonLogic commonLogic;
+    private final CommonMapper commonMapper;
+    private final ProductPriceUpdateService productPriceUpdateService;
+    private final ProductPriceUpdateItemService productPriceUpdateItemService;
+    private final ProductPriceService productPriceService;
+    private final SalesTypeService salesTypeService;
+    private final WalletService walletService;
+    private final RebateTypeService rebateTypeService;
+    private final GoodsMaterialService goodsMaterialService;
+
+    public IPage<ProductPriceUpdateVO> list(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.platformParam(zfireParamBean, ProductPriceUpdateVO.class, adminUser);
+
+        return commonMapper.productPriceUpdateList(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    public ProductPriceUpdateBean detail(String id) {
+        ProductPriceUpdateBean bean = new ProductPriceUpdateBean();
+        final ProductPriceUpdate priceUpdate = productPriceUpdateService.getById(id);
+        BeanUtils.copyProperties(priceUpdate, bean);
+
+        final List<ProductPriceUpdateItem> updateItems = productPriceUpdateItemService.lambdaQuery()
+                .eq(ProductPriceUpdateItem::getProductPriceUpdateId, id)
+                .list();
+        bean.setItems(updateItems);
+        return bean;
+    }
+
+    @Transactional
+    public void save(ProductPriceUpdateBean bean) {
+        List<ProductPriceUpdateItem> updateItemList = bean.getItems();
+        if (CollectionUtil.isEmpty(updateItemList)) {
+            throw new RemoteServiceException("明细不能为空");
+        }
+        if (StringUtils.isBlank(bean.getId())) {
+            final String generateNo = commonLogic.generateNo("PU", "PRODUCT_PRICE_UPDATE", 13);
+            bean.setId(generateNo);
+            bean.setExamineStatus(ExamineStatusEnum.SAVE.getKey());
+        } else {
+            final ProductPriceUpdate old = productPriceUpdateService.getById(bean.getId());
+            if (!old.getExamineStatus().equals(ExamineStatusEnum.SAVE.getKey())) {
+                throw new RemoteServiceException("单据状态已发生变化,请刷新");
+            }
+            productPriceUpdateItemService.lambdaUpdate()
+                    .eq(ProductPriceUpdateItem::getProductPriceUpdateId, bean.getId())
+                    .remove();
+        }
+        bean.setCompanyWechatId("0");
+
+        bean.insertOrUpdate();
+
+        for (ProductPriceUpdateItem updateItem : updateItemList) {
+            if (StringUtils.isBlank(updateItem.getWalletId())) {
+                throw new RemoteServiceException(updateItem.getSalesTypeName() + updateItem.getFactoryNo() + updateItem.getGoodsMaterialName() + "不能为空");
+            }
+        }
+
+        productPriceUpdateItemService.saveBatch(updateItemList.stream().peek(v -> v.setProductPriceUpdateId(bean.getId())).collect(Collectors.toList()));
+    }
+
+    @Transactional
+    public void batchExamine(List<String> ids) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        final List<ProductPriceUpdate> updateList = productPriceUpdateService.lambdaQuery()
+                .select(ProductPriceUpdate::getId, ProductPriceUpdate::getRemark)
+                .eq(ProductPriceUpdate::getExamineStatus, ExamineStatusEnum.WAIT.getKey())
+                .in(ProductPriceUpdate::getId, ids)
+                .list();
+
+
+        List<String> filterIds = updateList.stream()
+                .map(ProductPriceUpdate::getId)
+                .collect(Collectors.toList());
+
+        if (CollectionUtil.isEmpty(filterIds)) {
+            return;
+        }
+
+        final Map<String, String> updateMap = updateList.stream().collect(Collectors.toMap(ProductPriceUpdate::getId, v -> StringUtils.isNotBlank(v.getRemark()) ? v.getRemark() : ""));
+
+        productPriceUpdateService.lambdaUpdate()
+                .set(ProductPriceUpdate::getExamineBy, adminUser.getNickName())
+                .set(ProductPriceUpdate::getExamineTime, DateUtil.date())
+                .set(ProductPriceUpdate::getExamineStatus, ExamineStatusEnum.OK.getKey())
+                .in(ProductPriceUpdate::getId, filterIds)
+                .update();
+
+        final List<ProductPriceUpdateItem> updateItems = productPriceUpdateItemService.lambdaQuery()
+                .in(ProductPriceUpdateItem::getProductPriceUpdateId, filterIds)
+                .list();
+
+        List<ProductPrice> priceList = new ArrayList<>();
+        for (ProductPriceUpdateItem updateItem : updateItems) {
+            ProductPrice productPrice = new ProductPrice();
+            BeanUtils.copyProperties(updateItem, productPrice);
+            final String remark = updateMap.get(updateItem.getProductPriceUpdateId());
+            productPrice.setCompanyWechatId("0")
+                    .setRemark(remark);
+            priceList.add(productPrice);
+        }
+
+        productPriceService.saveBatch(priceList);
+    }
+
+    @Transactional
+    public void batchDel(List<String> ids) {
+        final List<String> filterIds = productPriceUpdateService.lambdaQuery()
+                .select(ProductPriceUpdate::getId)
+                .in(ProductPriceUpdate::getExamineStatus, ExamineStatusEnum.SAVE.getKey(), ExamineStatusEnum.FAIL.getKey())
+                .in(ProductPriceUpdate::getId, ids)
+                .list()
+                .stream()
+                .map(ProductPriceUpdate::getId)
+                .collect(Collectors.toList());
+        if (CollectionUtil.isNotEmpty(filterIds)) {
+            productPriceUpdateService.removeByIds(filterIds);
+            productPriceUpdateItemService.lambdaUpdate()
+                    .in(ProductPriceUpdateItem::getProductPriceUpdateId, filterIds)
+                    .remove();
+        }
+    }
+
+    @Transactional
+    public int importData(List<Object> objects, String remark) {
+        //所有销售类型code
+        List<SalesType> saleTypes = salesTypeService.lambdaQuery()
+                .eq(SalesType::getStatus, true)
+                .list();
+        Map<String, SalesType> saleTypeMap = saleTypes.stream().collect(Collectors.toMap(SalesType::getCode, v -> v));
+        //所有物料
+        List<GoodsMaterial> kingDeeMaterials = goodsMaterialService.lambdaQuery()
+                .eq(GoodsMaterial::getState, StateEnum.ON.getKey())
+                .eq(GoodsMaterial::getCompanyWechatId, "0")
+                .list();
+        Map<String, GoodsMaterial> materialMap = kingDeeMaterials.stream().collect(Collectors.toMap(GoodsMaterial::getFactoryNo, v -> v));
+        //查询所有现金钱包
+        List<Wallet> wallets = walletService.list();
+        Map<String, Wallet> walletMap = wallets.stream().collect(Collectors.toMap(Wallet::getCode, v -> v));
+        //查询所有返利钱包
+        List<RebateType> walletRebates = rebateTypeService.list();;
+        Map<String, RebateType> walletRebateMap = walletRebates.stream().collect(Collectors.toMap(RebateType::getCode, v -> v));
+
+        List<ProductPriceUpdateItem> resultList = new ArrayList<>();
+
+        int index = 2;
+        for(Object o : objects){
+            List<Object> row = (List<Object>)o;
+            String materialNumber = (String)row.get(0);
+            if(StringUtils.isEmpty(materialNumber)){
+                continue;
+            }
+            String saleTypeCode = (String)row.get(1);
+            BigDecimal price;
+            try {
+                price = new BigDecimal(row.get(2).toString());
+            } catch (Exception e) {
+                throw new RemoteServiceException("第" + index + "行, 单价转换出错, 请检查");
+            }
+
+            String walletNames = (String)row.get(3);
+            String rebateWalletNames = (String)row.get(4);
+            String[] walletName = walletNames.trim().replaceAll(",",",").split(",");
+            String startDate  = (String)row.get(5);
+            String endDate = (String)row.get(6);
+            if(StringUtils.isEmpty(startDate)){
+                startDate = DateUtils.formatDate(new Date());
+            }
+            if(StringUtils.isEmpty(endDate)){
+                endDate = "2100-01-01 23:59:59";
+            }
+            if(StringUtils.isEmpty(materialNumber) || StringUtils.isEmpty(saleTypeCode)
+                    || StringUtils.isEmpty(walletNames)){
+                throw new RemoteServiceException("第" + index + "行, 检测到物料编码/销售类型编码/现金钱包编码有为空的情况");
+            }
+            SalesType saleType = saleTypeMap.get(saleTypeCode);
+            if(saleType == null){
+                throw new RemoteServiceException("第" + index + "行, 销售类型编码:" + saleTypeCode + "不存在");
+            }
+            GoodsMaterial goodsMaterial = materialMap.get(materialNumber);
+            if(goodsMaterial == null){
+                throw new RemoteServiceException("第" + index + "行, 物料编码:" + materialNumber + "不存在");
+            }
+
+            ProductPriceUpdateItem item = new ProductPriceUpdateItem();
+            item.setSalesTypeId(saleType.getId());
+            item.setSalesTypeCode(saleTypeCode);
+            item.setSalesTypeName(saleType.getName());
+            item.setPrice(price);
+            item.setStartDate(DateUtil.parseDate(startDate));
+            item.setEndDate(DateUtil.parseDate(endDate));
+            item.setMainId(goodsMaterial.getMainId());
+            item.setMainName(goodsMaterial.getMainName());
+            item.setSmallId(goodsMaterial.getSmallId());
+            item.setSmallName(goodsMaterial.getSmallName());
+            item.setFactoryNo(goodsMaterial.getFactoryNo());
+            item.setGoodsMaterialId(goodsMaterial.getId());
+            item.setGoodsMaterialName(goodsMaterial.getGoodsName());
+            item.setSeriesName(goodsMaterial.getSeriesName());
+            item.setSpecsName(goodsMaterial.getSpecsName());
+            item.setUnit(goodsMaterial.getUnit());
+
+            List<String> walletIdList = new ArrayList<>();
+            List<String> walletCodedList = new ArrayList<>();
+            List<String> walletNameList = new ArrayList<>();
+            for(String name : walletName){
+                Wallet wallet = walletMap.get(name);
+                if(wallet == null){
+                    throw new RemoteServiceException("第" + index + "行, 钱包编码: "+name+", 不存在");
+                }
+                walletIdList.add(wallet.getId());
+                walletCodedList.add(wallet.getCode());
+                walletNameList.add(wallet.getName());
+            }
+
+            List<String> rebateTypeIdList = new ArrayList<>();
+            List<String> rebateTypeCodeList = new ArrayList<>();
+            List<String> rebateTypeNameList = new ArrayList<>();
+            if(StringUtils.isNotEmpty(rebateWalletNames)) {
+                String[] rebateWalletName = rebateWalletNames.trim().replaceAll(",",",").split(",");
+                for (String name : rebateWalletName) {
+                    RebateType walletRebate = walletRebateMap.get(name);
+                    if (walletRebate == null) {
+                        throw new RemoteServiceException("第" + index + "行, 返利钱包编码: " + name + ", 不存在");
+                    }
+//                    Integer count = commonLogic.getRebateSaleTypeCount(saleType.getId(), walletRebate.getWalletRebateId());
+//                    if (count == 0) {
+//                        throw new RemoteServiceException("返利钱包+【"+walletRebate.getName() + "】与销售类型【" + saleType.getSaleName() + "】对应关系不存在");
+//                    }
+
+                    rebateTypeIdList.add(walletRebate.getId());
+                    rebateTypeCodeList.add(walletRebate.getCode());
+                    rebateTypeNameList.add(walletRebate.getName());
+                }
+                item.setRebateTypeName(CollectionUtil.isNotEmpty(Arrays.asList(rebateWalletName)) ? StrUtil.join(",", Arrays.asList(rebateWalletName)) : null);
+            }
+            item.setWalletId(StrUtil.join(",", walletIdList));
+            item.setWalletCode(StrUtil.join(",", walletCodedList));
+            item.setWalletName(StrUtil.join(",", walletNameList));
+            item.setRebateTypeId(CollectionUtil.isNotEmpty(rebateTypeIdList) ? StrUtil.join(",", rebateTypeIdList) : null);
+            item.setRebateTypeCode(CollectionUtil.isNotEmpty(rebateTypeCodeList) ? StrUtil.join(",", rebateTypeCodeList) : null);
+            item.setRebateTypeName(CollectionUtil.isNotEmpty(rebateTypeNameList) ? StrUtil.join(",", rebateTypeNameList) : null);
+            resultList.add(item);
+
+            index++;
+        }
+
+        if (CollectionUtil.isNotEmpty(resultList)) {
+            ProductPriceUpdate productUpdPriceBillBean = new ProductPriceUpdate();
+            final String generateNo = commonLogic.generateNo("PU", "PRODUCT_PRICE_UPDATE", 13);
+            productUpdPriceBillBean.setId(generateNo)
+                    .setExamineStatus(ExamineStatusEnum.WAIT.getKey())
+                    .setRemark(remark)
+                    .insert();
+
+            productPriceUpdateItemService.saveBatch(resultList.stream()
+                    .peek(v -> v.setProductPriceUpdateId(generateNo))
+                    .collect(Collectors.toList()));
+        }
+
+        return resultList.size();
+    }
+
+    @Transactional
+    public void batchFail(List<String> ids) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        final List<ProductPriceUpdate> updateList = productPriceUpdateService.lambdaQuery()
+                .select(ProductPriceUpdate::getId)
+                .eq(ProductPriceUpdate::getExamineStatus, ExamineStatusEnum.WAIT.getKey())
+                .in(ProductPriceUpdate::getId, ids)
+                .list();
+
+
+        List<String> filterIds = updateList.stream()
+                .map(ProductPriceUpdate::getId)
+                .collect(Collectors.toList());
+
+        if (CollectionUtil.isEmpty(filterIds)) {
+            return;
+        }
+
+        productPriceUpdateService.lambdaUpdate()
+                .set(ProductPriceUpdate::getExamineBy, adminUser.getNickName())
+                .set(ProductPriceUpdate::getExamineTime, DateUtil.date())
+                .set(ProductPriceUpdate::getExamineStatus, ExamineStatusEnum.SAVE.getKey())
+                .in(ProductPriceUpdate::getId, filterIds)
+                .update();
+    }
+}

+ 69 - 0
mall-server-api/src/main/resources/mapper/CommonMapper.xml

@@ -1332,4 +1332,73 @@
         ${ex.orderBy}
         ${ex.orderBy}
     </select>
     </select>
 
 
+    <select id="productPriceList" resultType="com.gree.mall.manager.bean.supply.sales.price.ProductPriceVO">
+        SELECT
+            ${ex.selected}
+        FROM product_price a
+        ${ex.query}
+        AND a.del = 0
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
+
+    <select id="productPriceUpdateList"
+            resultType="com.gree.mall.manager.bean.supply.sales.price.ProductPriceUpdateVO">
+        SELECT
+        ${ex.selected}
+        FROM product_price_update a LEFT JOIN product_price_update_item b ON a.id = b.product_price_update_id
+        ${ex.query}
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
+
+    <select id="salesTypeList" resultType="com.gree.mall.manager.bean.supply.sales.config.SalesTypeVO">
+        SELECT
+            ${ex.selected}
+        FROM sales_type a
+        ${ex.query}
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
+
+    <select id="walletList" resultType="com.gree.mall.manager.bean.supply.sales.config.WalletVO">
+        SELECT
+            ${ex.selected}
+        FROM wallet a
+        ${ex.query}
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
+
+    <select id="rebateTypeList" resultType="com.gree.mall.manager.bean.supply.sales.config.RebateTypeVO">
+        SELECT
+            ${ex.selected}
+        FROM rebate_type a
+        ${ex.query}
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
+
+    <select id="companyWalletList" resultType="com.gree.mall.manager.bean.supply.sales.config.CompanyWalletVO">
+        SELECT
+        ${ex.selected}
+        FROM admin_company_wechat_wallet a LEFT JOIN wallet b ON a.wallet_id = b.id
+        LEFT JOIN admin_company_wechat c on a.company_wechat_id = c.company_wechat_id
+        ${ex.query}
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
+
 </mapper>
 </mapper>

BIN
mall-server-api/src/main/resources/template/调价单模板.xlsx


BIN
mall-server-api/src/main/resources/template/钱包对应关系模板.xlsx