Browse Source

网点配件销售列表、新增

FengChaoYu 8 months ago
parent
commit
bd403971a2
19 changed files with 1121 additions and 2 deletions
  1. 18 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsSalesBean.java
  2. 19 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsSalesItemBean.java
  3. 128 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsSalesVO.java
  4. 102 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsSalesWVO.java
  5. 4 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/stock/WebsitStockDTO.java
  6. 16 0
      mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/MaterialMapper.java
  7. 280 0
      mall-server-api/src/main/java/com/gree/mall/manager/controller/material/manage/WebsitPartsSalesOrderController.java
  8. 27 0
      mall-server-api/src/main/java/com/gree/mall/manager/enums/material/DeliveryTypeEnum.java
  9. 21 0
      mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsApplyCategoryEnum.java
  10. 27 0
      mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsApplyTypeEnum.java
  11. 24 0
      mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsOrderStatusEnum.java
  12. 22 0
      mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsPayFlagEnum.java
  13. 21 0
      mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsPushFlagEnum.java
  14. 1 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebitPartsOldStockLogic.java
  15. 2 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitPartsNewInLogic.java
  16. 5 2
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitPartsOldOutLogic.java
  17. 363 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitPartsSalesOrderLogic.java
  18. 1 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/stock/WebitPurchaseStockLogic.java
  19. 40 0
      mall-server-api/src/main/resources/mapper/MaterialMapper.xml

+ 18 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsSalesBean.java

@@ -0,0 +1,18 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import com.gree.mall.manager.plus.entity.WebsitPartsSales;
+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 WebsitPartsSalesBean extends WebsitPartsSales {
+
+    @ApiModelProperty(value = "订单配件信息", required = true)
+    private List<WebsitPartsSalesItemBean> itemList;
+}

+ 19 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsSalesItemBean.java

@@ -0,0 +1,19 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import com.gree.mall.manager.plus.entity.WebsitPartsSalesItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel
+public class WebsitPartsSalesItemBean extends WebsitPartsSalesItem {
+
+    @ApiModelProperty("可用库存")
+    private BigDecimal stockQty;
+
+}

+ 128 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsSalesVO.java

@@ -0,0 +1,128 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.material.*;
+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 WebsitPartsSalesVO {
+
+    @ApiModelProperty("销售单号")
+    private String id;
+
+    @ApiModelProperty(value = "商户名称")
+    private String companyWechatName;
+
+    @ApiModelProperty("销售类型")
+    private BuyPeopleEnum buyPeople;
+
+    @ApiModelProperty("申请类别")
+    private String applyCategory;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "网点编号")
+    private String websitId;
+
+    @ApiModelProperty("网点名称")
+    private String websitName;
+
+    @ApiModelProperty("申请类型")
+    private PartsApplyTypeEnum applyType;
+
+    @ApiModelProperty("发货方式")
+    private DeliveryTypeEnum deliveryType;
+
+    @ApiModelProperty("联系电话")
+    private String mobile;
+
+    @ApiModelProperty("接收单位")
+    private String receiveUnit;
+
+    @ApiModelProperty("发货单位")
+    private String deliveryUnit;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty("省")
+    private String province;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty("市")
+    private String city;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty("区")
+    private String area;
+
+    @ZfireField(tbName = "a")
+    @ApiModelProperty("详细地址")
+    private String addr;
+
+    @ApiModelProperty("购买方式")
+    private SourceSalesEnum orderSource;
+
+    @ApiModelProperty("订单状态")
+    private PartsOrderStatusEnum status;
+
+    @ApiModelProperty("支付状态")
+    private PartsPayFlagEnum payFlag;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty("网点提货标识0-可提货 1-不可提货")
+    private Integer deliveryConfirmFlag;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("创建人")
+    private String createBy;
+
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+    @ApiModelProperty("错误原因")
+    private String err;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty("配件编码")
+    private String partsNumber;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty("配件名称")
+    private String partsName;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty("销售价")
+    private BigDecimal salesPrice;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty("数量")
+    private Integer quantity;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty("审核数量")
+    private Integer examineQty;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty("退款方式")
+    private PayTypeEnum refundAmountMode;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "小程序/公众号")
+    private String source;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "仓储id")
+    private String storageId;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "仓储名称")
+    private String storageName;
+
+}

+ 102 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsSalesWVO.java

@@ -0,0 +1,102 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.material.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel
+@ZfireField(tbName = "a")
+public class WebsitPartsSalesWVO {
+
+    @ApiModelProperty("销售单号")
+    private String id;
+
+    @ApiModelProperty(value = "商户名称")
+    private String companyWechatName;
+
+    @ApiModelProperty("销售类型")
+    private BuyPeopleEnum buyPeople;
+
+    @ApiModelProperty("申请类别")
+    private String applyCategory;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "网点编号")
+    private String websitId;
+
+    @ApiModelProperty("网点名称")
+    private String websitName;
+
+    @ApiModelProperty("申请类型")
+    private PartsApplyTypeEnum applyType;
+
+    @ApiModelProperty("发货方式")
+    private DeliveryTypeEnum deliveryType;
+
+    @ApiModelProperty("联系电话")
+    private String mobile;
+
+    @ApiModelProperty("接收单位")
+    private String receiveUnit;
+
+    @ApiModelProperty("发货单位")
+    private String deliveryUnit;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty("省")
+    private String province;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty("市")
+    private String city;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty("区")
+    private String area;
+
+    @ZfireField(tbName = "a")
+    @ApiModelProperty("详细地址")
+    private String addr;
+
+    @ApiModelProperty("购买方式")
+    private SourceSalesEnum orderSource;
+
+    @ApiModelProperty("订单状态")
+    private PartsOrderStatusEnum status;
+
+    @ApiModelProperty("支付状态")
+    private PartsPayFlagEnum payFlag;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty("网点提货标识0-可提货 1-不可提货")
+    private Integer deliveryConfirmFlag;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("创建人")
+    private String createBy;
+
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+    @ApiModelProperty("错误原因")
+    private String err;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "小程序/公众号")
+    private String source;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "仓储id")
+    private String storageId;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "仓储名称")
+    private String storageName;
+}

+ 4 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/stock/WebsitStockDTO.java

@@ -37,6 +37,9 @@ public class WebsitStockDTO {
     @NotBlank(message = "网点名称不能空")
     private String websitName;
 
+    @ApiModelProperty("配件网点编号")
+    private String partsWebsitId;
+
     @ApiModelProperty("发生时间")
     @NotNull(message = "发生时间不能空")
     private Date sdate;
@@ -132,6 +135,7 @@ public class WebsitStockDTO {
         BeanUtils.copyProperties(this, websitStockAcc);
         websitStockAcc.setWebsitId(this.websitId)
                 .setWebsitName(this.websitName)
+                .setPartsWebsitId(this.partsWebsitId)
                 .setQty(qty)
                 .setCloseQty(closeQty)
                 .setOperateBy(this.operateBy)

+ 16 - 0
mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/MaterialMapper.java

@@ -283,4 +283,20 @@ public interface MaterialMapper {
      * @return
      */
     IPage<WebsitPartsConfigVO> websitPartsConfigPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 网点销售单列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<WebsitPartsSalesVO> websitPartsSalesPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 网点销售单列表(网点查看)
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<WebsitPartsSalesWVO> websitPartsSalesWPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
 }

+ 280 - 0
mall-server-api/src/main/java/com/gree/mall/manager/controller/material/manage/WebsitPartsSalesOrderController.java

@@ -0,0 +1,280 @@
+package com.gree.mall.manager.controller.material.manage;
+
+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.material.manage.WebsitPartsSalesBean;
+import com.gree.mall.manager.bean.material.manage.WebsitPartsSalesVO;
+import com.gree.mall.manager.bean.material.manage.WebsitPartsSalesWVO;
+import com.gree.mall.manager.enums.material.SourceSalesEnum;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.helper.ResponseHelper;
+import com.gree.mall.manager.logic.material.manage.WebsitPartsSalesOrderLogic;
+import com.gree.mall.manager.plus.entity.WebsitStock;
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Slf4j
+@RestController
+@Api(value = "网点配件销售单", tags = {"网点配件销售单"})
+@RequestMapping(value = "/parts/sales/order", produces = "application/json; charset=utf-8")
+public class WebsitPartsSalesOrderController {
+
+    @Resource
+    WebsitPartsSalesOrderLogic websitPartsSalesOrderLogic;
+
+    @Resource
+    RedisLockRegistry redisLockRegistry;
+
+//    @Resource
+//    WebsitSaleLogic websitSaleLogic;
+
+    @ApiOperation("配件销售单新增")
+    @PostMapping("/add")
+    public ResponseHelper<WebsitPartsSalesBean> add(
+            @RequestBody WebsitPartsSalesBean partsSalesOrderBean
+    ) throws Exception {
+        partsSalesOrderBean.setOrderSource(SourceSalesEnum.SELF.getKey());
+        websitPartsSalesOrderLogic.add(partsSalesOrderBean);
+        return ResponseHelper.success(partsSalesOrderBean);
+    }
+
+//    @ApiOperation("配件销售单修改")
+//    @PostMapping("/update")
+//    public ResponseHelper<PartsSalesOrderBean> update(
+//            @RequestBody PartsSalesOrderBean partsSalesOrderBean
+//    ) throws Exception {
+//        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + partsSalesOrderBean.getSalesOrderNo());
+//        if (!obtain.tryLock(5, TimeUnit.SECONDS)) {
+//            throw new RemoteServiceException("配件销售单冻结中");
+//        }
+//        try {
+//            websitPartsSalesOrderLogic.update(partsSalesOrderBean);
+//        } finally {
+//            obtain.unlock();
+//        }
+//
+//        return ResponseHelper.success(partsSalesOrderBean);
+//    }
+
+    @ApiOperation("配件销售单根据id获取")
+    @GetMapping("/loadSalesOrderById")
+    public ResponseHelper<WebsitPartsSalesBean> loadSalesOrderById(
+            @RequestParam String id
+    ) throws RemoteServiceException {
+        return ResponseHelper.success(websitPartsSalesOrderLogic.loadSalesOrderById(id, null));
+    }
+
+    @ZfireList
+    @PostMapping("/list")
+    @ApiOperation("配件销售列表")
+    public ResponseHelper<IPage<WebsitPartsSalesVO>> list(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) throws RemoteServiceException {
+        IPage<WebsitPartsSalesVO> partsSalesOrderBeanIPage = websitPartsSalesOrderLogic.list(zfireParamBean);
+        return ResponseHelper.success(partsSalesOrderBeanIPage, new TypeReference<WebsitPartsSalesVO>() {
+        });
+    }
+
+    @ZfireList
+    @PostMapping("/websit/list")
+    @ApiOperation("网点配件销售列表")
+    public ResponseHelper<IPage<WebsitPartsSalesWVO>> websitList(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) throws RemoteServiceException {
+        IPage<WebsitPartsSalesWVO> partsSalesOrderBeanIPage = websitPartsSalesOrderLogic.websitList(zfireParamBean);
+        return ResponseHelper.success(partsSalesOrderBeanIPage, new TypeReference<WebsitPartsSalesWVO>() {
+        });
+    }
+
+//    @PostMapping("/code")
+//    @ApiOperation(value = "生成支付二维码")
+//    public ResponseHelper<SalesPayList> generateCode(
+//            @ApiParam(value = "网点销售单id", required = true) @RequestParam String sheetId,
+//            @ApiParam(value = "网点支付配置id") @RequestParam(required = false) String payConfigId
+//    ) throws RemoteServiceException, IOException, JDOMException {
+//        return ResponseHelper.success(websitPartsSalesOrderLogic.generateCode(sheetId, payConfigId));
+//    }
+
+    @PostMapping("/list/export")
+    @ApiOperation("配件销售列表导出")
+    public void listExport(
+            @RequestBody ZfireParamBean zfireParamBean,
+            HttpServletRequest request,
+            HttpServletResponse response
+    ) throws Exception {
+        //2.查询要导出的内容
+        IPage<WebsitPartsSalesVO> partsSalesOrderBeanIPage = websitPartsSalesOrderLogic.list(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(partsSalesOrderBeanIPage.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+
+    @PostMapping("/websit/list/export")
+    @ApiOperation("网点配件销售列表导出")
+    public void shopListExport(
+            @RequestBody ZfireParamBean zfireParamBean,
+            HttpServletRequest request,
+            HttpServletResponse response
+    ) throws Exception {
+        //2.查询要导出的内容
+        IPage<WebsitPartsSalesWVO> partsSalesOrderBeanIPage = websitPartsSalesOrderLogic.websitList(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(partsSalesOrderBeanIPage.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+
+//    @ApiOperation("提交订单")
+//    @GetMapping("/submit")
+//    public ResponseHelper<PartsSalesOrderBean> submit(@ApiParam(value = "销售单id", required = true) @RequestParam String id) throws InterruptedException {
+//        PartsSalesOrderBean partsSalesOrderBean = websitPartsSalesOrderLogic.loadSalesOrderById(id, null);
+//        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + partsSalesOrderBean.getSalesOrderNo());
+//        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+//            throw new RemoteServiceException("销售单冻结中");
+//        }
+//        try {
+//            return ResponseHelper.success(websitPartsSalesOrderLogic.submit(partsSalesOrderBean.getSalesOrderNo()));
+//        } catch (Exception e) {
+//            log.error("【提交订单处理】失败", e);
+//            throw e;
+//        } finally {
+//            obtain.unlock();
+//        }
+//    }
+
+//    @ApiOperation("现金支付")
+//    @GetMapping("/change-cash")
+//    public ResponseHelper<PartsSalesOrderBean> changeCash(@ApiParam(value = "销售单号", required = true) @RequestParam String salesOrderNo) throws Exception {
+//        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + salesOrderNo);
+//        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+//            throw new RemoteServiceException("销售单冻结中");
+//        }
+//        try {
+//            return ResponseHelper.success(websitPartsSalesOrderLogic.changeCash(salesOrderNo));
+//        } catch (Exception e) {
+//            log.error("【提交订单处理】失败", e);
+//            throw e;
+//        } finally {
+//            obtain.unlock();
+//        }
+//    }
+//
+//    @ApiOperation("网点提货")
+//    @GetMapping("/confirmDelivery")
+//    public ResponseHelper shopConfirmDelivery(
+//            @ApiParam(value = "销售单号", required = true) @RequestParam String salesOrderNo,
+//            @ApiParam(value = "物流单号") @RequestParam(required = false) String logisticsNo
+//    ) throws Exception {
+//        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + salesOrderNo);
+//        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+//            throw new RemoteServiceException("销售单冻结中");
+//        }
+//        try {
+//            websitPartsSalesOrderLogic.shopConfirmDelivery(salesOrderNo, logisticsNo);
+//        } catch (Exception e) {
+//            log.error("【网点提货处理】失败", e);
+//            throw e;
+//        } finally {
+//            obtain.unlock();
+//        }
+//
+//        return ResponseHelper.success();
+//    }
+//
+//    @ApiOperation("删除")
+//    @GetMapping("/deleteById")
+//    public ResponseHelper deleteById(
+//            @ApiParam(value = "销售单id", required = true) @RequestParam String id
+//    ) throws RemoteServiceException {
+//        websitPartsSalesOrderLogic.deleteById(id);
+//        return ResponseHelper.success();
+//    }
+//
+//    @ApiOperation("退回0-保存状态")
+//    @GetMapping("/backToSave")
+//    public ResponseHelper<PartsSalesOrderBean> backToSave(
+//            @RequestParam String id
+//    ) throws Exception {
+//        PartsSalesOrderBean partsSalesOrderBean = websitPartsSalesOrderLogic.loadSalesOrderById(id, null);
+//        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + partsSalesOrderBean.getSalesOrderNo());
+//        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+//            throw new RemoteServiceException("销售单冻结中");
+//        }
+//        try {
+//            return ResponseHelper.success(websitPartsSalesOrderLogic.backToSave(partsSalesOrderBean.getSalesOrderNo()));
+//        } catch (Exception e) {
+//            log.error("【网点提货处理】失败", e);
+//            throw e;
+//        } finally {
+//            obtain.unlock();
+//        }
+//
+//    }
+//
+//    @ApiOperation("取消订单")
+//    @GetMapping("/cancel")
+//    public ResponseHelper cancel(@RequestParam String salesOrderNo) throws Exception {
+//        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + salesOrderNo);
+//        if (!obtain.tryLock(5, TimeUnit.SECONDS)) {
+//            throw new RemoteServiceException("配件销售单冻结中");
+//        }
+//        try {
+//            websitPartsSalesOrderLogic.cancel(salesOrderNo);
+//        } catch (Exception e) {
+//            log.error("【取消订单处理】失败", e);
+//            throw e;
+//        } finally {
+//            obtain.unlock();
+//        }
+//
+//        return ResponseHelper.success();
+//    }
+
+    @ApiOperation("获取配件可用库存")
+    @GetMapping("/query/parts/new/qty")
+    public ResponseHelper<WebsitStock> queryPartsNewQty(
+            @ApiParam(required = true, value = "网点编码") @RequestParam String websitId,
+            @ApiParam(required = true, value = "配件网点编号") @RequestParam String partsWebsitId,
+            @ApiParam(required = true, value = "配件编码") @RequestParam String partsNumber
+    ) {
+        return ResponseHelper.success(websitPartsSalesOrderLogic.queryPartsNewQty(websitId, partsWebsitId, partsNumber));
+    }
+
+//    @ShopDataNotAuth
+//    @GetMapping("/pay-config-list")
+//    @ApiOperation(value = "网点支付配置列表")
+//    public ResponseHelper<List<ShopPayConfig>> detail(
+//            @ApiParam(value = "网点编号", required = true) @RequestParam String shopId,
+//            @ApiParam(value = "类别", required = true) @RequestParam String category
+//    ) throws RemoteServiceException {
+//        List<ShopPayConfig> list = websitSaleLogic.payConfigList(shopId, category);
+//        return ResponseHelper.success(list);
+//    }
+//
+//    @ApiOperation("转换非申请")
+//    @GetMapping("/trans-not-apply")
+//    public ResponseHelper transNotApply(@RequestParam String salesOrderNo) throws Exception {
+//        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + salesOrderNo);
+//        if (!obtain.tryLock(5, TimeUnit.SECONDS)) {
+//            throw new RemoteServiceException("配件销售申请单冻结中");
+//        }
+//        try {
+//            websitPartsSalesOrderLogic.transNotApply(salesOrderNo);
+//        } catch (Exception e) {
+//            log.error("【转换非申请处理】失败", e);
+//            throw e;
+//        } finally {
+//            obtain.unlock();
+//        }
+//
+//        return ResponseHelper.success();
+//    }
+}

+ 27 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/material/DeliveryTypeEnum.java

@@ -0,0 +1,27 @@
+package com.gree.mall.manager.enums.material;
+
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+public enum DeliveryTypeEnum implements BaseEnum, IEnum<Integer> {
+    EXPRESS("0","快递"),
+    SELF("1","自提"),;
+
+    @EnumValue
+    @JsonValue
+    private final String key;
+    private final String remark;
+
+    @Override
+    public Integer getValue() {
+        return Integer.parseInt(key);
+    }
+}

+ 21 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsApplyCategoryEnum.java

@@ -0,0 +1,21 @@
+package com.gree.mall.manager.enums.material;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+public enum PartsApplyCategoryEnum implements BaseEnum {
+    HOME("HOME","家用空调"),
+    TRADE("TRADE","商用空调"),
+    ELEC("ELEC","生活电器(小家电)"),;
+
+    @EnumValue
+    @JsonValue
+    private final String key;
+    private final String remark;
+}

+ 27 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsApplyTypeEnum.java

@@ -0,0 +1,27 @@
+package com.gree.mall.manager.enums.material;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+public enum PartsApplyTypeEnum implements BaseEnum, IEnum<Integer> {
+    NORMAL("0","普通申请"),
+    URGENCY("1","急件申请"),
+    BAK("2","备件申请"),;
+
+    @EnumValue
+    @JsonValue
+    private final String key;
+    private final String remark;
+
+    @Override
+    public Integer getValue() {
+        return Integer.parseInt(key);
+    }
+}

+ 24 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsOrderStatusEnum.java

@@ -0,0 +1,24 @@
+package com.gree.mall.manager.enums.material;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+public enum PartsOrderStatusEnum implements BaseEnum {
+    SAVE("SAVE","保存"),
+    SUBMIT("SUBMIT","提交"),
+    PAYED("PAYED","已支付"),
+    END("END","已完成"),
+    CANCEL("CANCEL","已取消"),
+    EXCEPTION("EXCEPTION","订单异常"),;
+
+    @EnumValue
+    @JsonValue
+    private final String key;
+    private final String remark;
+}

+ 22 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsPayFlagEnum.java

@@ -0,0 +1,22 @@
+package com.gree.mall.manager.enums.material;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+public enum PartsPayFlagEnum implements BaseEnum {
+    NOT("NOT","未支付"),
+    PAY_NOT_TAKE("PAY_NOT_TAKE","已付未提货"),
+    PAY_TAKE("PAY_TAKE","已付提货"),
+    PAY_NOT_STOCK("PAY_NOT_STOCK","已付缺货");
+
+    @EnumValue
+    @JsonValue
+    private final String key;
+    private final String remark;
+}

+ 21 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsPushFlagEnum.java

@@ -0,0 +1,21 @@
+package com.gree.mall.manager.enums.material;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+public enum PartsPushFlagEnum implements BaseEnum {
+    SALES("SALES","销售"),
+    TRANS("TRANS","转销售"),
+    END("END","完结"),;
+
+    @EnumValue
+    @JsonValue
+    private final String key;
+    private final String remark;
+}

+ 1 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebitPartsOldStockLogic.java

@@ -35,6 +35,7 @@ public class WebitPartsOldStockLogic {
         websitStockDTO.setCompanyWechatName(oldOutRecord.getCompanyWechatName());
         websitStockDTO.setWebsitId(oldOutRecord.getSendWebsitId());
         websitStockDTO.setWebsitName(oldOutRecord.getSendWebsitName());
+        websitStockDTO.setPartsWebsitId(oldOutRecord.getSendPartsWebsitId());
         websitStockDTO.setSdate(oldOutRecord.getCreateTime());
         websitStockDTO.setPartsAttr(oldOutRecord.getObjectType().equals(PartsObjectTypeEnum.NEW_REFUND.toString()) ? PartsAttrEnum.NEW.toString() : PartsAttrEnum.OLD.toString());
         websitStockDTO.setGoodsId(oldOutRecord.getPartsNumber());

+ 2 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitPartsNewInLogic.java

@@ -191,6 +191,7 @@ public class WebsitPartsNewInLogic {
                     .setSendWebsitName("")
                     .setReceiveWebsitId(receiveShop.getWebsitId())
                     .setReceiveWebsitName(receiveShop.getName())
+                    .setReceivePartsWebsitId(receiveShop.getPartsWebsitId())
                     .setOrderDate(StringUtils.isNotBlank(orderDateStr) ? DateUtil.parseDateTime(orderDateStr) : null)
                     .setSysNo(sysNo)
                     .setReceiveDate(StringUtils.isNotBlank(receiveDate) ? DateUtil.parseDate(receiveDate) : null)
@@ -272,6 +273,7 @@ public class WebsitPartsNewInLogic {
                     .setQty(newInListBean.getQty())
                     .setReceiveWebsitId(websit.getWebsitId())
                     .setReceiveWebsitName(websit.getName())
+                    .setReceivePartsWebsitId(websit.getPartsWebsitId())
                     .setOrderDate(DateUtil.date())
                     .setSysNo(IdWorker.getIdStr())
                     .setOperateBy(adminUser.getNickName())

+ 5 - 2
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitPartsOldOutLogic.java

@@ -105,8 +105,9 @@ public class WebsitPartsOldOutLogic {
                         .setMaterialGroupName(bean.getMaterialGroupName())
                         .setGoodsStockUnit(bean.getGoodsStockUnit())
                         .setQty(bean.getQty())
-                        .setSendWebsitId(bean.getSendWebsitId())
-                        .setSendWebsitName(bean.getSendWebsitName())
+                        .setSendWebsitId(websit.getWebsitId())
+                        .setSendWebsitName(websit.getName())
+                        .setSendPartsWebsitId(websit.getPartsWebsitId())
                         .setOrderDate(DateUtil.date())
                         .setStorageId(storage.getStorageId())
                         .setStorageName(storage.getStorageName());
@@ -252,8 +253,10 @@ public class WebsitPartsOldOutLogic {
                     .setReceiveUnit(receiveUnit)
                     .setSendWebsitId(sendShop.getWebsitId())
                     .setSendWebsitName(sendShop.getName())
+                    .setSendPartsWebsitId(sendShop.getPartsWebsitId())
                     .setReceiveWebsitId("")
                     .setReceiveWebsitName("")
+                    .setReceivePartsWebsitId("")
                     .setOrderDate(StringUtils.isNotBlank(orderDateStr) ? DateUtil.parseDateTime(orderDateStr) : null)
                     .setSysNo(sysNo)
                     .setReceiveDate(StringUtils.isNotBlank(receiveDate) ? DateUtil.parseDate(receiveDate) : DateUtil.date())

+ 363 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitPartsSalesOrderLogic.java

@@ -0,0 +1,363 @@
+package com.gree.mall.manager.logic.material.manage;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
+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.material.manage.*;
+import com.gree.mall.manager.commonmapper.MaterialMapper;
+import com.gree.mall.manager.enums.IsEnum;
+import com.gree.mall.manager.enums.material.*;
+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 io.jsonwebtoken.lang.Collections;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+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.function.Function;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class WebsitPartsSalesOrderLogic {
+
+    private final CommonLogic commonLogic;
+    private final MaterialMapper materialMapper;
+    private final WebsitPartsSalesService websitPartsSalesService;
+    private final WebsitPartsSalesItemService websitPartsSalesItemService;
+    private final AdminWebsitService adminWebsitService;
+    private final WebsitGoodsService websitGoodsService;
+    private final WebsitPartsRefundConfigService websitPartsRefundConfigService;
+    private final WebsitStockService websitStockService;
+    private final StorageService storageService;
+    private final MaterialConfigService materialConfigService;
+
+    private Map<String, Object> validate(WebsitPartsSalesBean partsSalesOrderBean) {
+        Map<String, Object> result = new HashMap<>();
+        result.put("isSuccess" , Boolean.TRUE);
+
+        if(StringUtils.isBlank(partsSalesOrderBean.getWebsitId())) {
+            result.put("isSuccess", Boolean.FALSE);
+            result.put("msg", "新增配件销售单失败,没有网点");
+            return result;
+        }
+
+        if (StringUtils.isBlank(partsSalesOrderBean.getBuyPeople())) {
+            result.put("isSuccess", Boolean.FALSE);
+            result.put("msg", "请选择销售类型");
+            return result;
+        }
+
+        if (BuyPeopleEnum.WORKER.getKey().equals(partsSalesOrderBean.getBuyPeople())) {
+            if(StringUtils.isBlank(partsSalesOrderBean.getIdentity())) {
+                result.put("isSuccess", Boolean.FALSE);
+                result.put("msg", "新增配件销售单失败,服务人员身份证不能为空,请选择服务人员");
+                return result;
+            }
+        }
+
+        //获取申请类别
+        if(StringUtils.isBlank(partsSalesOrderBean.getApplyCategory())) {
+            result.put("isSuccess", Boolean.FALSE);
+            result.put("msg", "新增配件销售单失败,请选择申请类别");
+            return result;
+        }
+
+        // 获取对应网点
+        AdminWebsit websit = adminWebsitService.getById(partsSalesOrderBean.getWebsitId());
+        if (Objects.isNull(websit) || StringUtils.isBlank(websit.getPartsWebsitId())) {
+            result.put("isSuccess", Boolean.FALSE);
+            result.put("msg", "新增配件销售单失败,没有找到该网点" + partsSalesOrderBean.getWebsitId());
+            return result;
+        }
+        partsSalesOrderBean.setWebsitName(websit.getName());
+        partsSalesOrderBean.setPartsWebsitId(websit.getPartsWebsitId());
+
+        if (StringUtils.isBlank(partsSalesOrderBean.getStorageId())) {
+            final Storage storage = storageService.lambdaQuery()
+                    .eq(Storage::getCompanyWechatId, partsSalesOrderBean.getCompanyWechatId())
+                    .eq(Storage::getWebsitId, partsSalesOrderBean.getWebsitId())
+                    .eq(Storage::getIsDefault, IsEnum.Y.getValue())
+                    .one();
+            partsSalesOrderBean.setStorageId(storage.getStorageId())
+                    .setStorageName(storage.getStorageName());
+        }
+
+        if (Objects.isNull(partsSalesOrderBean.getApplyType())) {
+            result.put("isSuccess", Boolean.FALSE);
+            result.put("msg", "新增配件销售单失败,没有申请类型");
+            return result;
+        }
+        if (Objects.isNull(partsSalesOrderBean.getDeliveryType())) {
+            result.put("isSuccess", Boolean.FALSE);
+            result.put("msg", "新增配件销售单失败,请先选择发货方式");
+            return result;
+        }
+        if (Collections.isEmpty(partsSalesOrderBean.getItemList())) {
+            result.put("isSuccess", Boolean.FALSE);
+            result.put("msg", "新增配件销售单失败,没有配件明细信息");
+            return result;
+        }
+
+        // 快递必填详细地址
+        if (partsSalesOrderBean.getDeliveryType().equals(DeliveryTypeEnum.EXPRESS.getValue())
+                && StringUtils.isBlank(partsSalesOrderBean.getAddr())) {
+            result.put("isSuccess", Boolean.FALSE);
+            result.put("msg", "新增配件销售单失败,请填写详细地址");
+            return result;
+        }
+        //校验配件明细列表
+        LinkedHashSet<String> partsNumbers = new LinkedHashSet<>();
+        for(WebsitPartsSalesItem item : partsSalesOrderBean.getItemList()) {
+            if(StringUtils.isEmpty(item.getPartsNumber())) {
+                result.put("isSuccess", Boolean.FALSE);
+                result.put("msg", "新增配件销售单失败,配件编码不能为空");
+                return result;
+            }
+            if(Objects.isNull(item.getQty()) || Integer.parseInt(item.getQty().toString()) <= 0) {
+                result.put("isSuccess", Boolean.FALSE);
+                result.put("msg", "新增配件销售单失败,配件编码"+item.getPartsNumber() + "数量不能小于或等于0");
+                return result;
+            }
+            item.setCompanyWechatId(partsSalesOrderBean.getCompanyWechatId())
+                    .setWebsitId(partsSalesOrderBean.getWebsitId())
+                    .setPartsWebsitId(partsSalesOrderBean.getPartsWebsitId());
+
+            partsNumbers.add(item.getPartsNumber());
+        }
+        //根据配件编码查询对应的配件列表
+        final List<WebsitGoods> partsList = websitGoodsService.lambdaQuery()
+                .eq(WebsitGoods::getGoodsType, WebsitGoodsTypeEnum.P.getKey())
+                .eq(WebsitGoods::getNormType, NormTypeEnum.M.getKey())
+                .in(WebsitGoods::getGoodsCode, partsNumbers)
+                .eq(WebsitGoods::getStatus, StateEnum.ON.getKey())
+                .list();
+
+        if(Collections.isEmpty(partsList)) {
+            result.put("isSuccess", Boolean.FALSE);
+            result.put("msg", "新增配件销售单失败,系统找不到该配件配件编码: " + String.join(",", partsNumbers));
+            return result;
+        }
+        final Map<String, WebsitGoods> partsMap = partsList.stream().collect(Collectors.toMap(WebsitGoods::getGoodsCode, Function.identity()));
+        //检验每个配件明细是否在数据库里查到
+        LinkedHashSet<String> notExsistisPartsNumbers = new LinkedHashSet<>();
+        for(String partsNumber : partsNumbers) {
+            if( !partsMap.containsKey(partsNumber) || Objects.isNull(partsMap.get(partsNumber))) {
+                notExsistisPartsNumbers.add(partsNumber);
+            }
+        }
+        if(!Collections.isEmpty(notExsistisPartsNumbers)) {
+            result.put("isSuccess", Boolean.FALSE);
+            result.put("msg", "新增配件销售单失败,以下配件配件编码不存在: "+String.join(",", notExsistisPartsNumbers));
+            return result;
+        }
+        List<WebsitPartsSalesItemBean> values = new ArrayList<>(partsSalesOrderBean.getItemList().stream()
+                .collect(Collectors.toMap(WebsitPartsSalesItemBean::getPartsNumber, Function.identity(), (key1, key2) -> {
+                    key1.setQty(key1.getQty().add(key2.getQty()));
+                    return key1;
+                })).values());
+        partsSalesOrderBean.getItemList().clear();
+        partsSalesOrderBean.setItemList(values);
+
+        if(CollectionUtil.isNotEmpty(partsSalesOrderBean.getItemList())) {
+            WebsitPartsRefundConfig partsConfig = websitPartsRefundConfigService.lambdaQuery()
+                    .eq(WebsitPartsRefundConfig::getCompanyWechatId, partsSalesOrderBean.getCompanyWechatId())
+                    .eq(WebsitPartsRefundConfig::getIsDefault, Boolean.TRUE)
+                    .one();
+
+            //检查是否有可用库存
+            final List<WebsitStock> partsWebsitStockList = websitStockService.lambdaQuery()
+                    .in(WebsitStock::getGoodsId, partsNumbers)
+                    .eq(WebsitStock::getCompanyWechatId, partsSalesOrderBean.getCompanyWechatId())
+                    .eq(WebsitStock::getWebsitId, partsSalesOrderBean.getWebsitId())
+                    .list();
+
+            for (WebsitPartsSalesItem item : partsSalesOrderBean.getItemList()) {
+                if (!partsMap.containsKey(item.getPartsNumber()) || Objects.isNull(partsMap.get(item.getPartsNumber()))) {
+                    continue;
+                }
+                if (StringUtils.isEmpty(item.getPartsWebsitId())) {
+                    result.put("isSuccess", Boolean.FALSE);
+                    result.put("msg", "配件网点编号不能为空");
+                    break;
+                }
+                if (StringUtils.isEmpty(item.getPartsNumber())) {
+                    result.put("isSuccess", Boolean.FALSE);
+                    result.put("msg", "配件编号不能为空");
+                    break;
+                }
+                // 非申请单检验配件网点库存是否大于0
+                if (partsSalesOrderBean.getIsApply()) {
+                    if (partsWebsitStockList.stream().noneMatch(o ->
+                            item.getPartsWebsitId().equals(o.getPartsWebsitId())
+                                    && item.getPartsNumber().equals(o.getGoodsId())
+                    )) {
+                        result.put("isSuccess", Boolean.FALSE);
+                        result.put("msg", String.join("配件编号:", item.getPartsNumber(), ",在网点编号:", partsSalesOrderBean.getWebsitId(), "没有库存"));
+                        break;
+                    }
+                    List<WebsitStock> stockList = partsWebsitStockList.stream().filter(o ->
+                            item.getPartsWebsitId().equals(o.getPartsWebsitId())
+                                    && item.getPartsNumber().equals(o.getGoodsId())
+                    ).collect(Collectors.toList());
+                    WebsitGoods parts = partsMap.get(item.getPartsNumber());
+                    item.setWebsitId(partsSalesOrderBean.getWebsitId());
+                    item.setPartsId(parts.getGoodsId());
+                    item.setMaterialGroupName(parts.getMaterialGroupName());
+                    item.setUnitName(parts.getGoodsStockUnit());
+                    item.setPartsWebsitId(stockList.get(0).getPartsWebsitId());
+                    item.setPartsNumber(stockList.get(0).getGoodsId());
+                    item.setMarketPrice(parts.getMarketPrice());
+                    item.setExamineQty(item.getQty());
+                    item.setSecondPrice(parts.getSecondPrice());
+                    computeSalesPrice(partsConfig, parts, item, result);
+                } else {
+                    WebsitGoods parts = partsMap.get(item.getPartsNumber());
+                    item.setWebsitId(partsSalesOrderBean.getWebsitId());
+                    item.setPartsId(parts.getGoodsId());
+                    item.setMaterialGroupName(parts.getMaterialGroupName());
+                    item.setUnitName(parts.getGoodsStockUnit());
+                    item.setPartsWebsitId(partsSalesOrderBean.getPartsWebsitId());
+                    item.setPartsNumber(parts.getGoodsId());
+                    item.setMarketPrice(parts.getMarketPrice());
+                    item.setExamineQty(item.getQty());
+                    item.setSecondPrice(parts.getSecondPrice());
+                    computeSalesPrice(partsConfig, parts, item, result);
+                }
+            }
+        }
+        return result;
+    }
+
+    private void computeSalesPrice(WebsitPartsRefundConfig partsConfig, WebsitGoods parts, WebsitPartsSalesItem item, Map<String, Object> result) {
+        final MaterialConfig materialConfig = materialConfigService.lambdaQuery()
+                .eq(MaterialConfig::getCompanyWechatId, partsConfig.getCompanyWechatId())
+                .one();
+        switch (Optional.ofNullable(parts.getPartType()).orElse("")) {
+            case "":
+                result.put("isSuccess", Boolean.FALSE);
+                result.put("msg", "配件类型不能为空");
+                break;
+            case "空调":
+                item.setSalesPrice(item.getMarketPrice().multiply(materialConfig.getPriceRate1()).setScale(2, BigDecimal.ROUND_HALF_UP));
+                break;
+            case "冰箱":
+                item.setSalesPrice(item.getMarketPrice().multiply(materialConfig.getPriceRate2()).setScale(2, BigDecimal.ROUND_HALF_UP));
+                break;
+            case "生活电器":
+                item.setSalesPrice(item.getMarketPrice().multiply(materialConfig.getPriceRate3()).setScale(2, BigDecimal.ROUND_HALF_UP));
+                break;
+            default:
+                item.setSalesPrice(item.getMarketPrice().multiply(new BigDecimal("1.2")).setScale(2, BigDecimal.ROUND_HALF_UP));
+                break;
+        }
+    }
+
+    @Transactional
+    public void add(WebsitPartsSalesBean partsSalesOrderBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        if (adminUser.getType() == 2) {
+            throw new RemoteServiceException("平台账号禁止操作");
+        }
+        partsSalesOrderBean.setCompanyWechatId(adminUser.getCompanyWechatId())
+                .setCompanyWechatName(adminUser.getCompanyName());
+        //一系列校验
+        Map<String, Object> validateMap = this.validate(partsSalesOrderBean);
+        if(validateMap.containsKey("isSuccess") && !Boolean.parseBoolean(validateMap.get("isSuccess").toString())) {
+            throw new RemoteServiceException(validateMap.get("msg").toString());
+        }
+        //获取登录人昵称
+        DateTime curDate = DateUtil.date();
+
+        if (Objects.isNull(partsSalesOrderBean.getPayType())) {
+            // 默认通联
+            partsSalesOrderBean.setPayType(PayTypeEnum.ALLINPAY.getKey());
+        }
+        List<WebsitPartsSalesItemBean> itemList = partsSalesOrderBean.getItemList();
+        BigDecimal totalPrice = BigDecimal.ZERO;
+
+        if (CollectionUtil.isEmpty(itemList)) {
+            throw new RemoteServiceException("请选择配件");
+        }
+
+        for(WebsitPartsSalesItem partsSalesOrderItem : itemList) {
+            partsSalesOrderItem.setTotalAmount(partsSalesOrderItem.getSalesPrice().multiply(partsSalesOrderItem.getQty())
+                    .setScale(2, BigDecimal.ROUND_HALF_UP));
+            totalPrice = totalPrice.add(partsSalesOrderItem.getTotalAmount());
+        }
+
+        // 记录总金额
+        partsSalesOrderBean.setTotalPrice(totalPrice);
+        partsSalesOrderBean.setStatus(PartsOrderStatusEnum.SAVE.getKey());
+        // 生成订单号
+        String sheetId = commonLogic.generateMaterialNo(adminUser.getCompanyWechatId(), "PJ", PartsRefTypeEnum.SALES.getKey(), 13);
+        partsSalesOrderBean.setId(sheetId);
+        websitPartsSalesService.save(partsSalesOrderBean);
+
+        // 保存销售单明细
+        List<WebsitPartsSalesItem> partsSalesOrderItems = this.createSalesOrderItem(partsSalesOrderBean, itemList);
+        websitPartsSalesItemService.saveBatch(partsSalesOrderItems);
+    }
+
+    private List<WebsitPartsSalesItem> createSalesOrderItem(WebsitPartsSalesBean partsSalesOrderBean, List<WebsitPartsSalesItemBean> itemList) {
+        List<WebsitPartsSalesItem> partsSalesOrderItems = new ArrayList<>();
+        for(WebsitPartsSalesItemBean partsSalesOrderItemBean : itemList) {
+            WebsitPartsSalesItem partsSalesOrderItem = new WebsitPartsSalesItem();
+            BeanUtils.copyProperties(partsSalesOrderItemBean, partsSalesOrderItem);
+            partsSalesOrderItem.setSalesId(partsSalesOrderBean.getId())
+                    .setWebsitId(partsSalesOrderBean.getWebsitId())
+                    .setIdentity(partsSalesOrderBean.getIdentity());
+            partsSalesOrderItems.add(partsSalesOrderItem);
+        }
+        return partsSalesOrderItems;
+    }
+
+    public WebsitPartsSalesBean loadSalesOrderById(String id, Object o) {
+        return null;
+    }
+
+    public IPage<WebsitPartsSalesVO> list(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.materialParam(zfireParamBean, WebsitPartsSalesVO.class, adminUser);
+
+        return materialMapper.websitPartsSalesPage(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    public IPage<WebsitPartsSalesWVO> websitList(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.materialParam(zfireParamBean, WebsitPartsSalesWVO.class, adminUser);
+
+        return materialMapper.websitPartsSalesWPage(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    /**
+     * 根据网点编码,配件网点编号,配件编码查询配件网点库存,前端下拉配件编码的时候带出可用库存
+     * @param websitId
+     * @param partsWebsitId
+     * @param partsNumber
+     * @return
+     */
+    public WebsitStock queryPartsNewQty(String websitId, String partsWebsitId, String partsNumber) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        return websitStockService.lambdaQuery()
+                .eq(WebsitStock::getCompanyWechatId, adminUser.getCompanyWechatId())
+                .eq(WebsitStock::getGoodsType, WebsitGoodsTypeEnum.P.getKey())
+                .eq(WebsitStock::getGoodsId, partsNumber)
+                .eq(WebsitStock::getWebsitId, websitId)
+                .eq(WebsitStock::getPartsWebsitId, partsWebsitId)
+                .one();
+    }
+}

+ 1 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/stock/WebitPurchaseStockLogic.java

@@ -167,6 +167,7 @@ public class WebitPurchaseStockLogic {
             websitStockDTO.setCompanyWechatName(inRecord.getCompanyWechatName());
             websitStockDTO.setWebsitId(inRecord.getReceiveWebsitId());
             websitStockDTO.setWebsitName(inRecord.getReceiveWebsitName());
+            websitStockDTO.setPartsWebsitId(inRecord.getReceivePartsWebsitId());
             websitStockDTO.setSdate(inRecord.getCreateTime());
             websitStockDTO.setPartsAttr(PartsAttrEnum.NEW.toString());
             websitStockDTO.setVoucherNo(inRecord.getVoucherNo());

+ 40 - 0
mall-server-api/src/main/resources/mapper/MaterialMapper.xml

@@ -575,4 +575,44 @@
         </if>
         ${ex.orderBy}
     </select>
+
+    <select id="websitPartsSalesPage"
+            resultType="com.gree.mall.manager.bean.material.manage.WebsitPartsSalesVO">
+        SELECT
+            ${ex.selected},
+            CASE WHEN a.delivery_type = 0 AND a.buy_people = 'WORKER' AND a.websit_confirm_date IS NOT NULL THEN 1 ELSE 0 END AS deliveryConfirmFlag
+        FROM
+        websit_parts_sales a LEFT JOIN websit_parts_sales_item b ON a.id = b.sales_id
+        ${ex.query}
+        <if test="ex.adminWebsitIds != null and ex.adminWebsitIds.size > 0">
+            AND a.websit_id IN
+            <foreach item="item" index="index" collection="ex.adminWebsitIds" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
+
+    <select id="websitPartsSalesWPage"
+            resultType="com.gree.mall.manager.bean.material.manage.WebsitPartsSalesWVO">
+        SELECT
+            ${ex.selected},
+            CASE WHEN a.delivery_type = 0 AND a.buy_people = 'WORKER' AND a.websit_confirm_date IS NOT NULL THEN 1 ELSE 0 END AS deliveryConfirmFlag
+        FROM
+            websit_parts_sales a
+        ${ex.query}
+        <if test="ex.adminWebsitIds != null and ex.adminWebsitIds.size > 0">
+            AND a.websit_id IN
+            <foreach item="item" index="index" collection="ex.adminWebsitIds" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
 </mapper>