|
|
@@ -371,6 +371,12 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
@Autowired
|
|
|
private FsStoreOrderDfMapper fsStoreOrderDfMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private FsStoreVerifyCodeScrmMapper verifyCodeScrmMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IFsStoreVerifyCodeScrmService verifyCodeScrmService;
|
|
|
+
|
|
|
@PostConstruct
|
|
|
public void initErpServiceMap() {
|
|
|
erpServiceMap = new HashMap<>();
|
|
|
@@ -384,6 +390,14 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
@Autowired
|
|
|
private Hospital580PrescriptionScrmMapper prescriptionScrmMapper;
|
|
|
|
|
|
+ //溯源码
|
|
|
+ @Autowired
|
|
|
+ private IFsStoreVerifyCodeScrmService verifyCodeService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private FsStoreVerifyCodeScrmMapper verifyCodeMapper;
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 查询订单
|
|
|
*
|
|
|
@@ -434,6 +448,24 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
log.error("修改商城订单地址推送到聚水潭ERP失败,orderId: {}", fsStoreOrder.getId(), e);
|
|
|
}
|
|
|
|
|
|
+ //判断发货类型
|
|
|
+ if(fsStoreOrder.getStatus() == 2 || fsStoreOrder.getStatus() == 3) {//待收货
|
|
|
+ List<FsStoreOrderItemVO> scrmList = fsStoreOrderItemMapper.selectMyFsStoreOrderItemListByOrderId(fsStoreOrder.getId());
|
|
|
+ if (!scrmList.isEmpty()) {
|
|
|
+ List<Long> orderItemIds = scrmList.stream().map(FsStoreOrderItemVO::getItemId).collect(Collectors.toList());
|
|
|
+ //获取溯源码,进行回退
|
|
|
+ List<FsStoreVerifyCodeScrm> verifyCodes = verifyCodeScrmMapper.selectList(new LambdaQueryWrapper<FsStoreVerifyCodeScrm>().eq(FsStoreVerifyCodeScrm::getOrderId, fsStoreOrder.getId()).in(FsStoreVerifyCodeScrm::getOrderItemId, orderItemIds).eq(FsStoreVerifyCodeScrm::getIsDel, "0"));
|
|
|
+ if (!verifyCodes.isEmpty()) {
|
|
|
+ verifyCodes.forEach(v -> {
|
|
|
+ v.setIsRecycle(0L);
|
|
|
+ });
|
|
|
+ //批量更新数据
|
|
|
+ verifyCodeScrmService.updateBatchById(verifyCodes);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return fsStoreOrderMapper.updateFsStoreOrder(fsStoreOrder);
|
|
|
}
|
|
|
|
|
|
@@ -727,7 +759,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
|
|
|
|
|
|
@Override
|
|
|
- @Transactional
|
|
|
+ @Transactional(rollbackFor = Exception.class, timeout = 20)
|
|
|
public R createOrder(long userId, FsStoreOrderCreateParam param) {
|
|
|
FsStoreOrderComputedParam computedParam = new FsStoreOrderComputedParam();
|
|
|
BeanUtils.copyProperties(param, computedParam);
|
|
|
@@ -957,6 +989,34 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
item.setIsPrescribe(1);
|
|
|
}
|
|
|
fsStoreOrderItemMapper.insertFsStoreOrderItem(item);
|
|
|
+
|
|
|
+ // ===================== 溯源码核心逻辑 ==================
|
|
|
+ Integer buyCount = vo.getCartNum();
|
|
|
+ Long productId = vo.getProductId();
|
|
|
+ String productName = vo.getProductName();
|
|
|
+
|
|
|
+ if (buyCount <= 0) {
|
|
|
+ throw new ServiceException("商品[" + productName + "]购买数量不能为0");
|
|
|
+ }
|
|
|
+
|
|
|
+ //查询并锁定未出库溯源码带行锁
|
|
|
+ List<FsStoreVerifyCodeScrm> availableVerifyCodes = verifyCodeMapper.selectUnOutboundVerifyCodesWithLock(productId, buyCount);
|
|
|
+ if (availableVerifyCodes == null || availableVerifyCodes.size() < buyCount) {
|
|
|
+ String errorMsg = String.format("商品[%s]库存不足,需%s个,仅剩余%s个",
|
|
|
+ productName, buyCount, (availableVerifyCodes == null ? 0 : availableVerifyCodes.size()));
|
|
|
+ throw new ServiceException(errorMsg);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (FsStoreVerifyCodeScrm code : availableVerifyCodes) {
|
|
|
+ code.setOutboundStatus(1L);
|
|
|
+ code.setOrderId(storeOrder.getId());
|
|
|
+ code.setOrderItemId(item.getItemId());
|
|
|
+ code.setUpdateTime(new Date());
|
|
|
+ }
|
|
|
+ if (!availableVerifyCodes.isEmpty()) {
|
|
|
+ verifyCodeService.updateBatchById(availableVerifyCodes);
|
|
|
+ }
|
|
|
+ // ===================== 溯源码逻辑END =====================
|
|
|
listOrderItem.add(item);
|
|
|
}
|
|
|
if (listOrderItem.size() > 0) {
|
|
|
@@ -982,9 +1042,22 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
StoreConstants.REDIS_ORDER_OUTTIME_UNPAY, storeOrder.getId()));
|
|
|
|
|
|
if (config.getUnPayTime() != null && config.getUnPayTime() > 0) {
|
|
|
- redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
|
|
|
+ if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药72小时
|
|
|
+ config.setUnPayTime(4320);
|
|
|
+ redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
|
|
|
+ }else {
|
|
|
+ redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
|
|
|
+ }
|
|
|
} else {
|
|
|
- redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
|
|
|
+ if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药
|
|
|
+ if(config == null){
|
|
|
+ config = new StoreConfig();
|
|
|
+ }
|
|
|
+ config.setUnPayTime(4320);
|
|
|
+ redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
|
|
|
+ }else {
|
|
|
+ redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
|
|
|
+ }
|
|
|
}
|
|
|
//添加支付到期时间
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
@@ -1052,6 +1125,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
Long totalNum = 0l;
|
|
|
BigDecimal totalPrice = new BigDecimal(0);
|
|
|
BigDecimal totalCostPrice = new BigDecimal("0");
|
|
|
+ Map<Long,String> productMap = new HashMap<>();
|
|
|
for (FsPrescribeDrug drug : drugs) {
|
|
|
totalPrice = totalPrice.add(drug.getDrugPrice().multiply(BigDecimal.valueOf(drug.getDrugNum())));
|
|
|
totalNum = totalNum + drug.getDrugNum();
|
|
|
@@ -1089,6 +1163,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
item.setIsPrescribe(1);
|
|
|
item.setJsonInfo(JSON.toJSONString(dto));
|
|
|
items.add(item);
|
|
|
+ productMap.put(drug.getProductId(),drug.getDrugName());
|
|
|
}
|
|
|
//中药总价处理
|
|
|
if (prescribe.getPrescribeType().equals(2)) {
|
|
|
@@ -1109,6 +1184,34 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
for (FsStoreOrderItemScrm item : items) {
|
|
|
item.setOrderId(order.getId());
|
|
|
fsStoreOrderItemMapper.insertFsStoreOrderItem(item);
|
|
|
+
|
|
|
+ // ===================== 溯源码核心逻辑 ==================
|
|
|
+ Integer buyCount = item.getNum();
|
|
|
+ Long productId = item.getProductId();
|
|
|
+ String productName = productMap.get(productId) == null ? "商品" : productMap.get(productId);
|
|
|
+
|
|
|
+ if (buyCount <= 0) {
|
|
|
+ throw new ServiceException("商品[" + productName + "]购买数量不能为0");
|
|
|
+ }
|
|
|
+
|
|
|
+ //查询并锁定未出库溯源码带行锁
|
|
|
+ List<FsStoreVerifyCodeScrm> availableVerifyCodes = verifyCodeMapper.selectUnOutboundVerifyCodesWithLock(productId, buyCount);
|
|
|
+ if (availableVerifyCodes == null || availableVerifyCodes.size() < buyCount) {
|
|
|
+ String errorMsg = String.format("商品[%s]库存不足",
|
|
|
+ productName, buyCount, (availableVerifyCodes == null ? 0 : availableVerifyCodes.size()));
|
|
|
+ throw new ServiceException(errorMsg);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (FsStoreVerifyCodeScrm code : availableVerifyCodes) {
|
|
|
+ code.setOutboundStatus(1L);
|
|
|
+ code.setOrderId(order.getId());
|
|
|
+ code.setOrderItemId(item.getItemId());
|
|
|
+ code.setUpdateTime(new Date());
|
|
|
+ }
|
|
|
+ if (!availableVerifyCodes.isEmpty()) {
|
|
|
+ verifyCodeService.updateBatchById(availableVerifyCodes);
|
|
|
+ }
|
|
|
+ // ===================== 溯源码逻辑END =====================
|
|
|
}
|
|
|
fsStoreOrderLogsService.create(order.getId(), FsStoreOrderLogEnum.CREATE_ORDER.getValue(),
|
|
|
FsStoreOrderLogEnum.CREATE_ORDER.getDesc());
|
|
|
@@ -1277,6 +1380,22 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
order.setDeliveryId(deliveryId);
|
|
|
order.setDeliverySendTime(new Date());
|
|
|
|
|
|
+ //溯源码
|
|
|
+ List<FsStoreOrderItemVO> scrmList = fsStoreOrderItemMapper.selectMyFsStoreOrderItemListByOrderId(order.getId());
|
|
|
+ if (!scrmList.isEmpty()) {
|
|
|
+ List<Long> orderItemIds = scrmList.stream().map(FsStoreOrderItemVO::getItemId).collect(Collectors.toList());
|
|
|
+ //获取溯源码,进行回退
|
|
|
+ List<FsStoreVerifyCodeScrm> verifyCodes = verifyCodeScrmMapper.selectList(new LambdaQueryWrapper<FsStoreVerifyCodeScrm>().eq(FsStoreVerifyCodeScrm::getOrderId, order.getId()).in(FsStoreVerifyCodeScrm::getOrderItemId, orderItemIds).eq(FsStoreVerifyCodeScrm::getIsDel, "0"));
|
|
|
+ if (!verifyCodes.isEmpty()) {
|
|
|
+ verifyCodes.forEach(v -> {
|
|
|
+ v.setIsRecycle(0L);
|
|
|
+ });
|
|
|
+ //批量更新数据
|
|
|
+ verifyCodeScrmService.updateBatchById(verifyCodes);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
fsStoreOrderMapper.updateFsStoreOrder(order);
|
|
|
orderStatusService.create(order.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
|
|
|
OrderLogEnum.DELIVERY_GOODS.getDesc());
|
|
|
@@ -1655,9 +1774,22 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
String json = configService.selectConfigByKey("store.config");
|
|
|
StoreConfig config = JSONUtil.toBean(json, StoreConfig.class);
|
|
|
if (config.getUnPayTime() != null && config.getUnPayTime() > 0) {
|
|
|
- redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
|
|
|
+ if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药72小时
|
|
|
+ config.setUnPayTime(4320);
|
|
|
+ redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
|
|
|
+ }else {
|
|
|
+ redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
|
|
|
+ }
|
|
|
} else {
|
|
|
- redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
|
|
|
+ if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药
|
|
|
+ if(config == null){
|
|
|
+ config = new StoreConfig();
|
|
|
+ }
|
|
|
+ config.setUnPayTime(4320);
|
|
|
+ redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
|
|
|
+ }else {
|
|
|
+ redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
|
|
|
+ }
|
|
|
}
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
calendar.setTime(storeOrder.getCreateTime());
|
|
|
@@ -4809,7 +4941,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- @Transactional
|
|
|
+ @Transactional(rollbackFor = Exception.class, timeout = 20)
|
|
|
public R createOrderMultiStore(long userId, FsStoreOrderCreateParam param) {
|
|
|
|
|
|
FsStoreOrderComputedParam computedParam = new FsStoreOrderComputedParam();
|
|
|
@@ -4992,6 +5124,34 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
item.setIsPrescribe(1);
|
|
|
}
|
|
|
fsStoreOrderItemMapper.insertFsStoreOrderItem(item);
|
|
|
+
|
|
|
+ // ===================== 溯源码核心逻辑 ==================
|
|
|
+ Integer buyCount = vo.getCartNum();
|
|
|
+ Long productId = vo.getProductId();
|
|
|
+ String productName = vo.getProductName();
|
|
|
+
|
|
|
+ if (buyCount <= 0) {
|
|
|
+ throw new ServiceException("商品[" + productName + "]购买数量不能为0");
|
|
|
+ }
|
|
|
+
|
|
|
+ //查询并锁定未出库溯源码带行锁
|
|
|
+ List<FsStoreVerifyCodeScrm> availableVerifyCodes = verifyCodeMapper.selectUnOutboundVerifyCodesWithLock(productId, buyCount);
|
|
|
+ if (availableVerifyCodes == null || availableVerifyCodes.size() < buyCount) {
|
|
|
+ String errorMsg = String.format("商品[%s]库存不足",
|
|
|
+ productName, buyCount, (availableVerifyCodes == null ? 0 : availableVerifyCodes.size()));
|
|
|
+ throw new ServiceException(errorMsg);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (FsStoreVerifyCodeScrm code : availableVerifyCodes) {
|
|
|
+ code.setOutboundStatus(1L);
|
|
|
+ code.setOrderId(storeOrder.getId());
|
|
|
+ code.setOrderItemId(item.getItemId());
|
|
|
+ code.setUpdateTime(new Date());
|
|
|
+ }
|
|
|
+ if (!availableVerifyCodes.isEmpty()) {
|
|
|
+ verifyCodeService.updateBatchById(availableVerifyCodes);
|
|
|
+ }
|
|
|
+ // ===================== 溯源码逻辑END =====================
|
|
|
listOrderItem.add(item);
|
|
|
}
|
|
|
if (listOrderItem.size() > 0) {
|
|
|
@@ -5011,15 +5171,28 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
orderStatusService.create(storeOrder.getId(), OrderLogEnum.CREATE_ORDER.getValue(),
|
|
|
OrderLogEnum.CREATE_ORDER.getDesc());
|
|
|
|
|
|
- //加入redis,24小时自动取消
|
|
|
+ //加入redis
|
|
|
String redisKey = String.valueOf(StrUtil.format("{}{}",
|
|
|
StoreConstants.REDIS_ORDER_OUTTIME_UNPAY, storeOrder.getId()));
|
|
|
String json = configService.selectConfigByKey("store.config");
|
|
|
com.fs.store.config.StoreConfig config = JSONUtil.toBean(json, com.fs.store.config.StoreConfig.class);
|
|
|
if (config.getUnPayTime() != null && config.getUnPayTime() > 0) {
|
|
|
- redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
|
|
|
+ if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药72小时
|
|
|
+ config.setUnPayTime(4320);
|
|
|
+ redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
|
|
|
+ }else {
|
|
|
+ redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
|
|
|
+ }
|
|
|
} else {
|
|
|
- redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
|
|
|
+ if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药
|
|
|
+ if(config == null){
|
|
|
+ config = new com.fs.store.config.StoreConfig();
|
|
|
+ }
|
|
|
+ config.setUnPayTime(4320);
|
|
|
+ redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
|
|
|
+ }else {
|
|
|
+ redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
|
|
|
+ }
|
|
|
}
|
|
|
//添加支付到期时间
|
|
|
Calendar calendar = Calendar.getInstance();
|