diff --git a/crmeb-admin/src/main/java/com/zbkj/admin/config/WebSecurityConfig.java b/crmeb-admin/src/main/java/com/zbkj/admin/config/WebSecurityConfig.java index bc5b3fd..dcb4edb 100644 --- a/crmeb-admin/src/main/java/com/zbkj/admin/config/WebSecurityConfig.java +++ b/crmeb-admin/src/main/java/com/zbkj/admin/config/WebSecurityConfig.java @@ -144,6 +144,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers("/druid/**").anonymous() .antMatchers("/captcha/get", "/captcha/check").anonymous() .antMatchers("/api/admin/payment/callback/**").anonymous() + .antMatchers("/api/admin/store/order/add").anonymous() .antMatchers("/api/public/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() diff --git a/crmeb-admin/src/main/java/com/zbkj/admin/controller/StoreOrderController.java b/crmeb-admin/src/main/java/com/zbkj/admin/controller/StoreOrderController.java index 428802b..35b8448 100644 --- a/crmeb-admin/src/main/java/com/zbkj/admin/controller/StoreOrderController.java +++ b/crmeb-admin/src/main/java/com/zbkj/admin/controller/StoreOrderController.java @@ -302,6 +302,16 @@ public class StoreOrderController { return CommonResult.failed(); } + @ApiOperation(value = "新增订单") + @RequestMapping(value = "/add", method = RequestMethod.POST) + public CommonResult add(@RequestBody @Validated TradeOrderRespDTO request) { + if (storeOrderService.add(request)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + } diff --git a/crmeb-common/src/main/java/com/zbkj/common/request/TradeOrderDetailRespDTO.java b/crmeb-common/src/main/java/com/zbkj/common/request/TradeOrderDetailRespDTO.java new file mode 100644 index 0000000..88757ba --- /dev/null +++ b/crmeb-common/src/main/java/com/zbkj/common/request/TradeOrderDetailRespDTO.java @@ -0,0 +1,39 @@ +package com.zbkj.common.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * @author wyq + */ +@Data +public class TradeOrderDetailRespDTO { + @ApiModelProperty("skuNo") + @NotNull(message = "skuNo不能为空") + private String skuNo; + + private String brandType; + private String priceNote; + @ApiModelProperty("skuName") + @NotNull(message = "skuName不能为空") + private String skuName; + @ApiModelProperty("销售价格") + @NotNull(message = "销售价格不可为空") + private BigDecimal sellPrice; + @ApiModelProperty("销售数量") + @NotBlank(message = "销售数量不能为空") + private Integer sellQty; + @ApiModelProperty("成本") + private BigDecimal cost; + @ApiModelProperty("毛利") + private BigDecimal profit; + @ApiModelProperty("库存") + private Integer inStock; + + private BigDecimal profitRate; + +} diff --git a/crmeb-common/src/main/java/com/zbkj/common/request/TradeOrderRespDTO.java b/crmeb-common/src/main/java/com/zbkj/common/request/TradeOrderRespDTO.java new file mode 100644 index 0000000..9bf09db --- /dev/null +++ b/crmeb-common/src/main/java/com/zbkj/common/request/TradeOrderRespDTO.java @@ -0,0 +1,116 @@ +package com.zbkj.common.request; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author wyq + */ +@Data +@ApiModel("手工订单详情返回对象") +public class TradeOrderRespDTO { + @ApiModelProperty("渠道 可选值:TO_B,EMPLOYEE_IN_PURCHASE") + private String channelCode; + private String channelName; + @ApiModelProperty("业务归属部门code") + @NotBlank(message = "业务归属部门code不能为空") + private String deptCode; + @ApiModelProperty("业务员") + @NotBlank(message = "业务员不能为空") + private String businessMan; + @ApiModelProperty("平台单号") + private String platformCode; + + @ApiModelProperty("下单商户/会员") + @NotBlank(message = "下单商户或购物会员号不能为空") + private String buyVip; + @ApiModelProperty("下单时间") + @NotBlank(message = "下单时间不能为空") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime orderTime; + + @ApiModelProperty("预付款时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime perPayTime; + @ApiModelProperty("凭证") + private String proofPath; + @ApiModelProperty("凭证名称") + private String proofName; + @Size(max = 100, message = "买家备注长度不能超过100字") + @ApiModelProperty("买家备注") + private String userRemark; + @Size(max = 100, message = "卖家备注长度不能超过100字") + @ApiModelProperty("卖家备注") + private String salerRemark; + @ApiModelProperty("发货仓库code") + @NotBlank(message = "发货仓库code不能为空") + private String warehouseCode; + @NotNull(message = "订单商品不能为空") + @ApiModelProperty("订单商品") + private List item; + @NotBlank(message = "收货人名称不能为空") + @ApiModelProperty("收货人") + private String receiverName; + @NotBlank(message = "收货人手机号不能为空") + @ApiModelProperty("收货人手机号") + private String receiverPhone; + @NotBlank(message = "收货人地址不能为空") + @ApiModelProperty("收货人地址") + private String receiverAddress; + @ApiModelProperty("收货人城市") + @NotBlank(message = "收货人城市不能为空") + private String receiverCity; + @ApiModelProperty("收货人区县") + @NotBlank(message = "收货人区县不能为空") + private String receiverDistrict; + @ApiModelProperty("收货人省份") + @NotBlank(message = "收货人省份不能为空") + private String receiverProvince; + + + @ApiModelProperty("发票抬头") + @NotBlank(message = "发票抬头不能为空") + private String invoiceTitle; + @ApiModelProperty("收票人") + @NotBlank(message = "收票人不能为空") + private String receiver; + + @ApiModelProperty("纳税人标识号") + private String ratepayerCode; + @ApiModelProperty("注册地址") + private String registerAddress; + @ApiModelProperty("注册电话") + private String registerPhone; + @ApiModelProperty("开户银行") + private String registerBank; + @ApiModelProperty("银行账号") + private String registerAccount; + @ApiModelProperty("总额") + private BigDecimal totalAmount; + @ApiModelProperty("毛利") + private BigDecimal profit; + @ApiModelProperty("销售中心编码") + private String saleCenterCode; + @ApiModelProperty("销售中心名称") + private String saleCenterName; + @ApiModelProperty("销售主体") + private String sellerSubject; + + @ApiModelProperty("购买主体") + private String buyerSubject; + + @ApiModelProperty("入库仓库编码") + private String inWareHouseCode; + @ApiModelProperty("入库仓库名称") + private String inWareHouseName; + +} diff --git a/crmeb-service/src/main/java/com/zbkj/service/service/StoreOrderService.java b/crmeb-service/src/main/java/com/zbkj/service/service/StoreOrderService.java index 2bd1637..e9c0dc5 100644 --- a/crmeb-service/src/main/java/com/zbkj/service/service/StoreOrderService.java +++ b/crmeb-service/src/main/java/com/zbkj/service/service/StoreOrderService.java @@ -2,13 +2,12 @@ package com.zbkj.service.service; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.IService; +import com.zbkj.common.model.order.StoreOrder; import com.zbkj.common.page.CommonPage; import com.zbkj.common.request.*; import com.zbkj.common.response.*; import com.zbkj.common.vo.ExpressSheetVo; import com.zbkj.common.vo.LogisticsResultVo; -import com.zbkj.common.model.order.StoreOrder; -import com.zbkj.common.vo.MyRecord; import java.math.BigDecimal; import java.util.List; @@ -423,4 +422,6 @@ public interface StoreOrderService extends IService { Boolean refundRequestPass(RefundPassRequest request); String sendNew(StoreOrderSendRequest request); + + boolean add(TradeOrderRespDTO request); } diff --git a/crmeb-service/src/main/java/com/zbkj/service/service/impl/StoreOrderServiceImpl.java b/crmeb-service/src/main/java/com/zbkj/service/service/impl/StoreOrderServiceImpl.java index 09bfe5a..d07c97f 100644 --- a/crmeb-service/src/main/java/com/zbkj/service/service/impl/StoreOrderServiceImpl.java +++ b/crmeb-service/src/main/java/com/zbkj/service/service/impl/StoreOrderServiceImpl.java @@ -23,6 +23,7 @@ import com.zbkj.common.model.extend.MallExpressInfoDto; import com.zbkj.common.model.order.StoreOrder; import com.zbkj.common.model.order.StoreOrderInfo; import com.zbkj.common.model.parcel.ParcelPO; +import com.zbkj.common.model.product.StoreProductAttr; import com.zbkj.common.model.product.StoreProductAttrValue; import com.zbkj.common.model.sms.SmsTemplate; import com.zbkj.common.model.system.SystemAdmin; @@ -55,6 +56,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; import javax.annotation.Resource; @@ -1803,6 +1805,88 @@ public class StoreOrderServiceImpl extends ServiceImpl storeOrderInfos=new ArrayList<>(); + String orderNo=CrmebUtil.getOrderNo("order1"); + Integer totalNum=0; + BigDecimal totalPrice=BigDecimal.ZERO; + for(TradeOrderDetailRespDTO detail:request.getItem()){ + totalNum=totalNum+detail.getSellQty(); + LambdaQueryWrapper queryWrapper=new LambdaQueryWrapper<>(); + queryWrapper.eq(StoreProductAttrValue::getBarCode,detail.getSkuNo()); + queryWrapper.orderByDesc(StoreProductAttrValue::getId).last(" limit 1"); + StoreProductAttrValue storeProductAttrValue= storeProductAttrValueDao.selectOne(queryWrapper); + if(storeProductAttrValue==null){ + storeProductAttrValue=new StoreProductAttrValue(); + storeProductAttrValue.setProductId(27); + storeProductAttrValue.setOtPrice(detail.getSellPrice()); + storeProductAttrValue.setPrice(detail.getSellPrice()); + storeProductAttrValue.setStock(10000); + storeProductAttrValue.setBarCode(detail.getSkuNo()); + storeProductAttrValue.setSuk(detail.getSkuName()); + storeProductAttrValue.setBrokerage(BigDecimal.ZERO); + storeProductAttrValue.setBrokerageTwo(BigDecimal.ZERO); + storeProductAttrValue.setCost(detail.getSellPrice()); + storeProductAttrValue.setAttrValue("{\"规格\":\"默认\"}"); + storeProductAttrValue.setImage(""); + storeProductAttrValue.setQuota(10000); + storeProductAttrValue.setQuotaShow(10000); + storeProductAttrValue.setUnique(""); + storeProductAttrValueDao.insert(storeProductAttrValue); + } + StoreOrderInfo storeOrderInfo=new StoreOrderInfo(); + storeOrderInfo.setInfo(detail.getSkuName()); + storeOrderInfo.setImage(""); + storeOrderInfo.setOrderNo(orderNo); + storeOrderInfo.setIsReply(false); + storeOrderInfo.setAttrValueId(storeProductAttrValue.getId()); + storeOrderInfo.setGiveIntegral(0); + storeOrderInfo.setIsSub(false); + storeOrderInfo.setPayNum(detail.getSellQty()); + storeOrderInfo.setProductId(storeProductAttrValue.getProductId()); + storeOrderInfo.setPrice(detail.getSellPrice()); + storeOrderInfo.setProductName(detail.getSkuName()); + storeOrderInfo.setProductType(0); + storeOrderInfo.setUnique(""); + storeOrderInfo.setSku(detail.getSkuNo()); + storeOrderInfo.setVolume(BigDecimal.ONE); + storeOrderInfo.setWeight(BigDecimal.ONE); + storeOrderInfos.add(storeOrderInfo); + totalPrice=totalPrice.add(storeOrderInfo.getPrice().multiply(new BigDecimal(storeOrderInfo.getPayNum()))); + } + StoreOrder storeOrder=new StoreOrder(); + storeOrder.setOrderId(orderNo); + storeOrder.setUid(5); + storeOrder.setRealName(request.getReceiverName()); + storeOrder.setUserPhone(request.getReceiverPhone()); + storeOrder.setUserAddress(request.getReceiverAddress()); + storeOrder.setFreightPrice(BigDecimal.ZERO); + storeOrder.setTotalNum(totalNum); + storeOrder.setTotalPrice(totalPrice); + storeOrder.setTotalPostage(BigDecimal.ZERO); + storeOrder.setPayPrice(totalPrice); + storeOrder.setPaid(true); + storeOrder.setPayTime(new Date()); + storeOrder.setPayType("weixin"); + storeOrder.setCreateTime(new Date()); + storeOrder.setStatus(0); + storeOrder.setCost(totalPrice); + storeOrder.setIsChannel(4); + storeOrder.setType(0); + storeOrder.setProTotalPrice(totalPrice); + storeOrder.setHasSync(1); + storeOrder.setOutTradeNo("wx"+orderNo); + dao.insert(storeOrder); + + storeOrderInfos.forEach(info -> info.setOrderId(storeOrder.getId())); + // 生成订单日志 + storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_STATUS_CACHE_CREATE_ORDER, "订单生成"); + return true; + } + private void mappingExpressCode(StoreOrderSendRequest request, StoreOrder storeOrder) { List expressNames = request.getExpressList().stream().map(MallExpressInfoDto::getExpressName).collect(Collectors.toList()); Map expressMap = expressService.getByNames(expressNames).stream().collect(Collectors.toMap(Express::getName, Function.identity(), (v1, v2) -> v1));