Parcourir la source

Merge branch 'master' of http://git.ds-bay.com/project/kmall-haikong

Scott il y a 3 ans
Parent
commit
4d8f801588
100 fichiers modifiés avec 4708 ajouts et 401 suppressions
  1. 6 0
      kmall-admin/pom.xml
  2. 49 0
      kmall-admin/src/main/java/com/kmall/admin/config/JacksonConfig.java
  3. 1 1
      kmall-admin/src/main/java/com/kmall/admin/controller/ExportExcelController.java
  4. 7 3
      kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java
  5. 160 0
      kmall-admin/src/main/java/com/kmall/admin/controller/haikong/StockChangeController.java
  6. 143 0
      kmall-admin/src/main/java/com/kmall/admin/controller/haikong/StockChangeRecordController.java
  7. 61 0
      kmall-admin/src/main/java/com/kmall/admin/controller/order/OrderConfirmController.java
  8. 17 33
      kmall-admin/src/main/java/com/kmall/admin/controller/order/OrderController.java
  9. 51 9
      kmall-admin/src/main/java/com/kmall/admin/cuspay/biz/ali/AliCusDeclareBiz.java
  10. 44 14
      kmall-admin/src/main/java/com/kmall/admin/cuspay/biz/ali/AliCusDeclareQueryBiz.java
  11. 2 2
      kmall-admin/src/main/java/com/kmall/admin/cuspay/biz/wx/WxCusDeclareBiz.java
  12. 3 5
      kmall-admin/src/main/java/com/kmall/admin/cuspay/support/sign/RSA.java
  13. 7 0
      kmall-admin/src/main/java/com/kmall/admin/dao/GoodsDao.java
  14. 2 0
      kmall-admin/src/main/java/com/kmall/admin/dao/MkActivitiesPromotionDao.java
  15. 4 0
      kmall-admin/src/main/java/com/kmall/admin/dao/ProductStoreRelaDao.java
  16. 2 0
      kmall-admin/src/main/java/com/kmall/admin/dao/haikong/HaiKongSendOrderInfoRecordDao.java
  17. 30 0
      kmall-admin/src/main/java/com/kmall/admin/dao/haikong/StockChangeDao.java
  18. 37 0
      kmall-admin/src/main/java/com/kmall/admin/dao/haikong/StockChangeRecordDao.java
  19. 2 0
      kmall-admin/src/main/java/com/kmall/admin/dao/mk/MkActivitiesAssociationDao.java
  20. 2 0
      kmall-admin/src/main/java/com/kmall/admin/dao/mk/MkActivitiesDao.java
  21. 2 0
      kmall-admin/src/main/java/com/kmall/admin/dao/mk/MkActivitiesScoreDao.java
  22. 83 0
      kmall-admin/src/main/java/com/kmall/admin/dto/StockChangeDto.java
  23. 65 0
      kmall-admin/src/main/java/com/kmall/admin/dto/StockChangeRecordDto.java
  24. 23 0
      kmall-admin/src/main/java/com/kmall/admin/entity/OrderGoodsEntity.java
  25. 18 0
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongMemberOrderSyncResendEntity.java
  26. 3 0
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongMemberScoreChangeRecordEntity.java
  27. 365 0
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/StockChangeEntity.java
  28. 198 0
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/StockChangeRecordEntity.java
  29. 3 3
      kmall-admin/src/main/java/com/kmall/admin/haikong/client/HaiKongMemberTemplate.java
  30. 69 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/Constants.java
  31. 15 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/MemberOrderInfoSyncDTO.java
  32. 30 5
      kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberOrderSyncResendTask.java
  33. 11 5
      kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberSysAccessTokenRefreshTask.java
  34. 11 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/vo/CalculateOrderDiscountPriceVO.java
  35. 15 0
      kmall-admin/src/main/java/com/kmall/admin/service/GoodsService.java
  36. 3 0
      kmall-admin/src/main/java/com/kmall/admin/service/MerchService.java
  37. 2 0
      kmall-admin/src/main/java/com/kmall/admin/service/MkActivitiesPromotionService.java
  38. 2 0
      kmall-admin/src/main/java/com/kmall/admin/service/MngChangeService.java
  39. 2 0
      kmall-admin/src/main/java/com/kmall/admin/service/OrderService.java
  40. 13 0
      kmall-admin/src/main/java/com/kmall/admin/service/ProductStoreRelaService.java
  41. 2 0
      kmall-admin/src/main/java/com/kmall/admin/service/StoreMngChangeService.java
  42. 4 0
      kmall-admin/src/main/java/com/kmall/admin/service/haikong/HaiKongSendOrderInfoRecordService.java
  43. 90 0
      kmall-admin/src/main/java/com/kmall/admin/service/haikong/StockChangeRecordService.java
  44. 85 0
      kmall-admin/src/main/java/com/kmall/admin/service/haikong/StockChangeService.java
  45. 81 1
      kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java
  46. 5 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/MerchServiceImpl.java
  47. 5 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/MkActivitiesPromotionServiceImpl.java
  48. 5 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/MngChangeServiceImpl.java
  49. 225 58
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  50. 80 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/ProductStoreRelaServiceImpl.java
  51. 5 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/StoreMngChangeServiceImpl.java
  52. 10 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/HaikongSendOrderInfoRecordServiceImpl.java
  53. 186 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/StockChangeRecordServiceImpl.java
  54. 303 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/StockChangeServiceImpl.java
  55. 5 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/MkActivitiesScoreServiceImpl.java
  56. 42 5
      kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/MkActivitiesServiceImpl.java
  57. 2 0
      kmall-admin/src/main/java/com/kmall/admin/service/mk/MkActivitiesScoreService.java
  58. 2 0
      kmall-admin/src/main/java/com/kmall/admin/service/mk/MkActivitiesService.java
  59. 6 5
      kmall-admin/src/main/java/com/kmall/admin/task/SalsDetailTask.java
  60. 2 1
      kmall-admin/src/main/java/com/kmall/admin/task/SendToEccsTask.java
  61. 6 5
      kmall-admin/src/main/java/com/kmall/admin/task/SyncOmsTask.java
  62. 30 0
      kmall-admin/src/main/resources/XmlTemplate/StockChangeDtoList.xml
  63. 23 0
      kmall-admin/src/main/resources/XmlTemplate/StockChangeRecordDtoList.xml
  64. 36 9
      kmall-admin/src/main/resources/conf/cuspay/cuspay-ali.properties
  65. 2 2
      kmall-admin/src/main/resources/logback.xml
  66. 37 0
      kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml
  67. 4 1
      kmall-admin/src/main/resources/mybatis/mapper/MkActivitiesPromotionDao.xml
  68. 5 5
      kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml
  69. 15 1
      kmall-admin/src/main/resources/mybatis/mapper/OrderProcessRecordDao.xml
  70. 27 0
      kmall-admin/src/main/resources/mybatis/mapper/ProductStoreRelaDao.xml
  71. 40 0
      kmall-admin/src/main/resources/mybatis/mapper/StoreMngChangeDao.xml
  72. 33 0
      kmall-admin/src/main/resources/mybatis/mapper/haikong/HaikongSendOrderInfoRecordDao.xml
  73. 200 0
      kmall-admin/src/main/resources/mybatis/mapper/haikong/StockChangeDao.xml
  74. 186 0
      kmall-admin/src/main/resources/mybatis/mapper/haikong/StockChangeRecordDao.xml
  75. 4 1
      kmall-admin/src/main/resources/mybatis/mapper/mk/MkActivitiesAssociationDao.xml
  76. 7 0
      kmall-admin/src/main/resources/mybatis/mapper/mk/MkActivitiesDao.xml
  77. 3 0
      kmall-admin/src/main/resources/mybatis/mapper/mk/MkActivitiesScoreDao.xml
  78. 19 19
      kmall-admin/src/main/resources/spring/spring-mvc.xml
  79. 4 1
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiespromotion.html
  80. 4 1
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiesscore.html
  81. 66 9
      kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html
  82. 15 8
      kmall-admin/src/main/webapp/WEB-INF/page/shop/offilineOrderList.html
  83. 125 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/stockchange.html
  84. 106 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/stockchangerecord.html
  85. 131 122
      kmall-admin/src/main/webapp/WEB-INF/page/sys/main.html
  86. 2 2
      kmall-admin/src/main/webapp/WEB-INF/page/vip/mall2pointsrules.html
  87. 9 1
      kmall-admin/src/main/webapp/js/mk/mkactivities.js
  88. 3 1
      kmall-admin/src/main/webapp/js/mk/mkactivityform.js
  89. 1 1
      kmall-admin/src/main/webapp/js/sale/pickupcode.js
  90. 216 58
      kmall-admin/src/main/webapp/js/sale/sale.js
  91. 4 0
      kmall-admin/src/main/webapp/js/shop/mngchange.js
  92. 11 3
      kmall-admin/src/main/webapp/js/shop/offilineOrderList.js
  93. 324 0
      kmall-admin/src/main/webapp/js/shop/stockchange.js
  94. 255 0
      kmall-admin/src/main/webapp/js/shop/stockchangerecord.js
  95. 4 0
      kmall-admin/src/main/webapp/js/shop/storemngchange.js
  96. 15 1
      kmall-admin/src/main/webapp/js/vip/mall2pointsrules.js
  97. BIN
      kmall-admin/src/main/webapp/statics/file/stock_change.xlsx
  98. BIN
      kmall-admin/src/main/webapp/statics/file/stock_change_record.xlsx
  99. 22 0
      kmall-api/src/main/java/com/kmall/api/api/ApiIndexController.java
  100. 6 0
      kmall-common/pom.xml

+ 6 - 0
kmall-admin/pom.xml

@@ -230,6 +230,12 @@
             <version>0.0.19</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.22.0.ALL</version>
+        </dependency>
+
         <!--    阿里云短信服务api    -->
         <dependency>
             <groupId>com.aliyun</groupId>

+ 49 - 0
kmall-admin/src/main/java/com/kmall/admin/config/JacksonConfig.java

@@ -0,0 +1,49 @@
+package com.kmall.admin.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.TimeZone;
+
+/**
+ * @author lhm
+ * @createDate 2021-12-29
+ */
+@Configuration
+public class JacksonConfig {
+
+    @Bean
+    public ObjectMapper objectMapper() {
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+
+        objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
+
+        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
+
+        return objectMapper;
+    }
+
+    @Bean
+    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
+        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
+
+        mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
+        List<MediaType> mediaTypes = new ArrayList<>();
+        mediaTypes.add(MediaType.parseMediaType("application/json;charset=UTF-8"));
+        mediaTypes.add(MediaType.parseMediaType("text/html;charset=UTF-8"));
+
+        mappingJackson2HttpMessageConverter.setSupportedMediaTypes(mediaTypes);
+
+        return mappingJackson2HttpMessageConverter;
+    }
+
+}

+ 1 - 1
kmall-admin/src/main/java/com/kmall/admin/controller/ExportExcelController.java

@@ -56,7 +56,7 @@ public class ExportExcelController {
         String storeName = "";
         String storeId = "";
 
-        if(params.get("storeName") != null){
+        if(!Objects.isNull(params.get("storeName"))){
             storeName = (String) params.get("storeName");
 
             // 查询门店名称的门店id

+ 7 - 3
kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java

@@ -458,9 +458,13 @@ public class GoodsController {
                             throw new RRException("文件为:" + barcode + "的商品命名格式不正确,请检查!");
                         }
                         GoodsEntity goodsEntity = goodsService.queryByBarcode(barcode);
-                        goodsEntity.setPrimaryPicUrl(url);
-                        goodsEntity.setListPicUrl(url);
-                        goodsService.updateForImgUrl(goodsEntity);
+                        if (Objects.isNull(goodsEntity)) {
+                            log.error("商品图片名【{}】所对应商品不存在!", barcode);
+                        } else {
+                            goodsEntity.setPrimaryPicUrl(url);
+                            goodsEntity.setListPicUrl(url);
+                            goodsService.updateForImgUrl(goodsEntity);
+                        }
                     }
                     //保存文件信息
                     SysOssEntity ossEntity = new SysOssEntity();

+ 160 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/haikong/StockChangeController.java

@@ -0,0 +1,160 @@
+package com.kmall.admin.controller.haikong;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.kmall.admin.dto.StockChangeDto;
+import com.kmall.admin.dto.StockChangeRecordDto;
+import com.kmall.admin.entity.haikong.StockChangeEntity;
+import com.kmall.admin.haikong.constant.Constants;
+import com.kmall.admin.service.haikong.StockChangeService;
+import com.kmall.common.constant.JxlsXmlTemplateName;
+import com.kmall.common.utils.PageUtils;
+import com.kmall.common.utils.Query;
+import com.kmall.common.utils.R;
+import com.kmall.common.utils.excel.ExcelUtil;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * Controller
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-29 14:46:49
+ */
+@Controller
+@RequestMapping("stockchange")
+public class StockChangeController {
+    @Autowired
+    private StockChangeService stockChangeService;
+    @Autowired
+    private ExcelUtil excelUtil;
+    private final static Logger log = LoggerFactory.getLogger(StockChangeController.class);
+
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<StockChangeEntity> stockChangeList = stockChangeService.queryList(query);
+        int total = stockChangeService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(stockChangeList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{id}")
+    @ResponseBody
+    public R info(@PathVariable("id") String id) {
+        StockChangeEntity stockChange = stockChangeService.queryObject(id);
+
+        return R.ok().put("stockChange", stockChange);
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+    @ResponseBody
+    public R save(@RequestBody StockChangeEntity stockChange) {
+        stockChangeService.save(stockChange);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+    @ResponseBody
+    public R update(@RequestBody StockChangeEntity stockChange) {
+        stockChangeService.update(stockChange);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+    @ResponseBody
+    public R delete(@RequestBody String[]ids) {
+        stockChangeService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<StockChangeEntity> list = stockChangeService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+
+
+    /**
+     * 导入excel
+     */
+    @PostMapping("/upload")
+    @ResponseBody
+    public R storeUpload(@RequestParam("file") MultipartFile file) {
+        List<StockChangeRecordDto> stockChangeRecordDtos = new ArrayList<>();
+        StockChangeDto stockChangeDto = new StockChangeDto();
+        try {
+
+            StockChangeRecordDto stockChangeRecordDto = new StockChangeRecordDto();
+
+            Map<String, Object> beans = new HashMap<String, Object>();
+            beans.put("StockChangeRecordDto", stockChangeRecordDto);
+            beans.put("StockChangeRecordDtoList", stockChangeRecordDtos);
+            beans.put("StockChangeDto", stockChangeDto);
+            if (file.isEmpty()) {
+                return R.error("文件不能为空!");
+            }
+            excelUtil.readExcel(JxlsXmlTemplateName.STOCK_CHANGE_DTO_LIST, beans, file.getInputStream());
+        } catch (Exception e) {
+            log.error("导入出入库记录失败:", e);
+            return R.error("导入失败!");
+        }
+        try {
+            stockChangeService.uploadExcel(stockChangeRecordDtos, stockChangeDto);
+        } catch (RuntimeException e){
+            log.error("出入库记录导入数据写入表失败:", e);
+            return R.error(e.getMessage());
+        }
+        //上传文件
+        return R.ok("导入成功!");
+    }
+
+    @PostMapping("/audit")
+//    @RequiresPermissions("stockchange:audit")
+    @ResponseBody
+    public R audit (@RequestBody Map<String, Object> params) {
+        String[] strings = new String[]{};
+        stockChangeService.updateAuditStatus(((List<String>) params.get("ids")).toArray(strings), (String) params.get("type"));
+
+        return R.ok();
+    }
+
+}

+ 143 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/haikong/StockChangeRecordController.java

@@ -0,0 +1,143 @@
+package com.kmall.admin.controller.haikong;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.kmall.admin.dto.StockChangeRecordDto;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
+import com.kmall.admin.service.haikong.StockChangeRecordService;
+import com.kmall.common.constant.JxlsXmlTemplateName;
+import com.kmall.common.utils.PageUtils;
+import com.kmall.common.utils.Query;
+import com.kmall.common.utils.R;
+import com.kmall.common.utils.excel.ExcelUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+
+/**
+ * 海控出入库单记录Controller
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-27 16:21:47
+ */
+@Controller
+@RequestMapping("stockchangerecord")
+public class StockChangeRecordController {
+    @Autowired
+    private StockChangeRecordService stockChangeRecordService;
+    @Autowired
+    private ExcelUtil excelUtil;
+
+    private final static Logger log = LoggerFactory.getLogger(StockChangeRecordController.class);
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<StockChangeRecordEntity> stockChangeRecordList = stockChangeRecordService.queryList(query);
+        int total = stockChangeRecordService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(stockChangeRecordList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{id}")
+    @ResponseBody
+    public R info(@PathVariable("id") Integer id) {
+        StockChangeRecordEntity stockChangeRecord = stockChangeRecordService.queryObject(id);
+
+        return R.ok().put("stockChangeRecord", stockChangeRecord);
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+    @ResponseBody
+    public R save(@RequestBody StockChangeRecordEntity stockChangeRecord) {
+        stockChangeRecordService.save(stockChangeRecord);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+    @ResponseBody
+    public R update(@RequestBody StockChangeRecordEntity stockChangeRecord) {
+        stockChangeRecordService.update(stockChangeRecord);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+    @ResponseBody
+    public R delete(@RequestBody Integer[]ids) {
+        stockChangeRecordService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<StockChangeRecordEntity> list = stockChangeRecordService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 导入excel
+     */
+    @PostMapping("/upload")
+    @ResponseBody
+    public R storeUpload(@RequestParam("file") MultipartFile file) {
+        List<StockChangeRecordDto> stockChangeRecordDtos = new ArrayList<>();//信息
+        try {
+
+            StockChangeRecordDto stockChangeRecordDto = new StockChangeRecordDto();
+            Map<String, Object> beans = new HashMap<String, Object>();
+            beans.put("StockChangeRecordDto", stockChangeRecordDto);
+            beans.put("StockChangeRecordDtoList", stockChangeRecordDtos);
+            if (file.isEmpty()) {
+                return R.error("文件不能为空!");
+            }
+            excelUtil.readExcel(JxlsXmlTemplateName.STOCK_CHANGE_RECORD_DTO_LIST, beans, file.getInputStream());
+        } catch (Exception e) {
+            log.error("导入出入库记录失败:", e);
+            return R.error("导入失败!");
+        }
+        try {
+            stockChangeRecordService.uploadExcel(stockChangeRecordDtos);
+        } catch (RuntimeException e){
+            log.error("出入库记录导入数据写入表失败:", e);
+            return R.error(e.getMessage());
+        }
+        //上传文件
+        return R.ok("导入成功!");
+    }
+}

+ 61 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/order/OrderConfirmController.java

@@ -0,0 +1,61 @@
+package com.kmall.admin.controller.order;
+
+import com.kmall.admin.fromcomm.entity.SysUserEntity;
+import com.kmall.admin.service.OrderService;
+import com.kmall.admin.utils.ShiroUtils;
+import com.kmall.common.utils.R;
+import com.kmall.manager.manager.express.sf.ServiceException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+import java.util.Map;
+
+
+/**
+ * @author wcq
+ * @email
+ * @date 2022-02-09 10:41:09
+ */
+@RestController
+@RequestMapping("order")
+public class OrderConfirmController {
+    private Log logger = LogFactory.getLog(OrderConfirmController.class);
+    @Autowired
+    private OrderService orderService;
+
+    /**
+     * 收银端支付
+     * @param param
+     * @return
+     * @throws IOException
+     */
+    @RequestMapping("/orderConfirm")
+    public R orderConfirm(@RequestBody Map param) throws IOException {
+
+        SysUserEntity user = ShiroUtils.getUserEntity();
+        Map resultObj = null;
+        try {
+//            throw new RuntimeException("系统异常");
+            synchronized (this){
+                resultObj = orderService.offlineRetailSubmit(param,user);
+            }
+            if(resultObj.get("errno") != null && ((Integer)resultObj.get("errno")) == 400){
+                return R.error((String) resultObj.get("errmsg"));
+            }
+            return R.ok().put("resultObj", resultObj);
+        } catch (ServiceException e) {
+            return R.error(e.getMessage());
+        } catch (Exception e) {
+            if (e.getMessage().contains("java.lang.IllegalStateException: invalid auth_code!")){
+                return R.error("付款码异常,请重新输入!");
+            }
+            return R.error(e.getMessage());
+        }
+
+    }
+}

+ 17 - 33
kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java → kmall-admin/src/main/java/com/kmall/admin/controller/order/OrderController.java

@@ -1,15 +1,16 @@
-package com.kmall.admin.controller;
+package com.kmall.admin.controller.order;
 
+import com.alibaba.druid.support.json.JSONUtils;
 import com.kmall.admin.dto.OrderExpressDto;
 import com.kmall.admin.dto.SystemFormatDto;
 import com.kmall.admin.entity.*;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceResponseVO;
+import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceVO;
 import com.kmall.admin.service.*;
 import com.kmall.admin.utils.CalculateTax;
 import com.kmall.admin.utils.ParamUtils;
 import com.kmall.admin.utils.ShiroUtils;
-import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceVO;
 import com.kmall.common.constant.Dict;
 import com.kmall.common.constant.JxlsXmlTemplateName;
 import com.kmall.common.utils.*;
@@ -24,7 +25,6 @@ import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
 import com.kmall.manager.manager.alipay.AliPayUtil;
 import com.kmall.manager.manager.dto.PayOriginInfoDTO;
 import com.kmall.manager.manager.express.sf.ServiceException;
-import com.kmall.manager.manager.merch.OmsMerchPropertiesBuilder;
 import com.kmall.manager.manager.pingan.PinganUtil;
 import com.kmall.manager.manager.pingan.dto.PinganResponseDto;
 import com.kmall.manager.manager.wechat.WechatGlobalUtil;
@@ -971,35 +971,6 @@ public class OrderController {
 
 
     /**
-     * 收银端支付
-     * @param param
-     * @return
-     * @throws IOException
-     */
-    @RequestMapping("/orderConfirm")
-    public R orderConfirm(@RequestBody Map param) throws IOException {
-
-        SysUserEntity user = ShiroUtils.getUserEntity();
-        Map resultObj = null;
-        try {
-//            throw new RuntimeException("系统异常");
-            resultObj = orderService.offlineRetailSubmit(param,user);
-            if(resultObj.get("errno") != null && ((Integer)resultObj.get("errno")) == 400){
-                return R.error((String) resultObj.get("errmsg"));
-            }
-            return R.ok().put("resultObj", resultObj);
-        } catch (ServiceException e) {
-            return R.error(e.getMessage());
-        } catch (Exception e) {
-            if (e.getMessage().contains("java.lang.IllegalStateException: invalid auth_code!")){
-                return R.error("付款码异常,请重新输入!");
-            }
-            return R.error(e.getMessage());
-        }
-
-    }
-
-    /**
      * 海控退款
      * @param param
      * @return
@@ -1379,7 +1350,15 @@ public class OrderController {
                 }else{
                     systemFormat.setTransactionType("销售");
                 }
-                orderStatus = Dict.orderStatus.valueOf("item_"+orderStatus).getItemName();
+                // 将订单状态转为文字
+                if(StringUtils.isNotEmpty(orderStatus)){
+                    orderStatus = Dict.orderStatus.valueOf("item_"+orderStatus).getItemName();
+                }else {
+                    orderStatus = "订单状态异常";
+                    logger.error("订单状态为空,订单明细信息为:" + JSONUtils.toJSONString(systemFormat) + "备查");
+                    logger.error("订单状态为空,订单明细列表为:" + JSONUtils.toJSONString(systemFormatList) + "备查");
+                }
+
                 if (Objects.nonNull(systemFormat.getPrimeCost()) && Objects.nonNull(systemFormat.getGoodsNumber())) {
                     String primeCost = systemFormat.getPrimeCost();
                     BigDecimal gp = new BigDecimal(primeCost);
@@ -1500,6 +1479,11 @@ public class OrderController {
         return orderService.resendOrderHkMall(orderSn);
     }
 
+    @RequestMapping("/resendOrderHkMall/{orderSn}/vmcshop")
+    public R resendOrderInfoToVmcShop(@PathVariable("orderSn") String orderSn) {
+        return orderService.resendOrderInfoToVmcShop(orderSn);
+    }
+
     /**
      * 总计
      */

+ 51 - 9
kmall-admin/src/main/java/com/kmall/admin/cuspay/biz/ali/AliCusDeclareBiz.java

@@ -1,5 +1,6 @@
 package com.kmall.admin.cuspay.biz.ali;
 
+import com.alipay.api.internal.util.AlipaySignature;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Strings;
 import com.google.common.collect.Maps;
@@ -17,6 +18,7 @@ import com.kmall.admin.cuspay.manager.snow.SnowflakeUtil;
 import com.kmall.admin.cuspay.service.MerchNotiService;
 import com.kmall.admin.cuspay.support.msg.resp.ResponseMessage;
 import com.kmall.admin.cuspay.support.msg.resp.ResponseStatus;
+import com.kmall.admin.cuspay.support.sign.RSA;
 import com.kmall.admin.cuspay.util.*;
 import com.kmall.admin.cuspay.ccnet2cuspay.common.MerchNotiBuilder;
 import com.kmall.admin.cuspay.ccnet2cuspay.service.ali.AliCbPayDocService;
@@ -40,6 +42,8 @@ import org.springframework.util.StringUtils;
 import com.kmall.admin.cuspay.biz.ali.support.sign.MD5;
 
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -114,11 +118,21 @@ public class AliCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
             // 商户海关备案名称
             aliCbPayDoc.setMerchantCustomsName(customsName);
             // 商户生成的用于唯一标识一次报关操作的业务编号
-            aliCbPayDoc.setOutRequestNo(Contants.WX + SnowflakeUtil.getSnowNextId());
+//            aliCbPayDoc.setOutRequestNo(Contants.WX + SnowflakeUtil.getSnowNextId());
+            aliCbPayDoc.setOutRequestNo(params.get("orderSn").toString());
             // 合作者身份ID
             aliCbPayDoc.setPartner(partner);
             // 该交易在支付宝系统中的交易流水号
             aliCbPayDoc.setTradeNo(params.get("tradeNo").toString());
+            // 订购人姓名,可空
+            if (params.get("buyerIdNo") != null) {
+                aliCbPayDoc.setBuyerIdNo(params.get("buyerIdNo").toString());
+            }
+            // 订购人身份证号,可空
+            if (params.get("buyerName") != null) {
+                aliCbPayDoc.setBuyerName(params.get("buyerName").toString());
+            }
+
             // *********设置支付单报关参数*********
 
             // *********设置商户通知表参数*********
@@ -193,10 +207,9 @@ public class AliCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
         Map<String, Object> stringObjectMap = null;
 
         try {
-            // todo, 请求海关接口
-             String result = OkHttpUtils.get(declareURL + paramter);
-//            String result = "";
-            result = new String(result.getBytes("GBK"));
+            // 请求海关接口
+            String result = OkHttpUtils.get(declareURL + paramter);
+            result = new String(result.getBytes(StandardCharsets.UTF_8));
             doc = DocumentHelper.parseText(result);
             logger.info("alipay response message result :" + result);
             stringObjectMap = XmlUtils.Dom2Map(doc);
@@ -341,7 +354,11 @@ public class AliCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
      * @param aliCbPayDoc 支付宝支付数据
      * @return
      */
-    protected static String assemblyDeclareXml(AliCbPayDoc aliCbPayDoc) {
+    protected String assemblyDeclareXml(AliCbPayDoc aliCbPayDoc) {
+        String MD5Key = environment.getProperty("ali.payment.md5.key");
+        String RSAPrivateKey = environment.getProperty("ali.payment.rsa.private-key");
+        String encryption = environment.getProperty("ali.payment.encryption");
+
         Map<String, String> paramMap = new HashMap<>();
         paramMap.put("amount", aliCbPayDoc.getAmount());
         paramMap.put("customs_place", aliCbPayDoc.getCustomsPlace());
@@ -352,6 +369,12 @@ public class AliCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
         paramMap.put("partner", aliCbPayDoc.getPartner());
         paramMap.put("service", "alipay.acquire.customs");
         paramMap.put("trade_no", aliCbPayDoc.getTradeNo());
+        if (org.apache.commons.lang.StringUtils.isNotBlank(aliCbPayDoc.getBuyerName())) {
+            paramMap.put("buyer_name", aliCbPayDoc.getBuyerName());
+        }
+        if (org.apache.commons.lang.StringUtils.isNotBlank(aliCbPayDoc.getBuyerIdNo())) {
+            paramMap.put("buyer_id_no", aliCbPayDoc.getBuyerIdNo());
+        }
         List<String> keys = new ArrayList<>(paramMap.keySet());
         Collections.sort(keys);
         String prestr = "";
@@ -364,9 +387,28 @@ public class AliCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
                 prestr = prestr + key + "=" + value + "&";
             }
         }
-        String sign = MD5.sign(prestr, "6zo20oar6qufb6x41ipli3yma9ju107h", "UTF-8");
-        prestr = prestr + "&sign_type=MD5";
-        prestr = prestr + "&sign=" + sign;
+
+        String sign = "";
+        // 判断环境
+        if ("dev".equals(encryption)) {
+            // MD5加密
+            sign = MD5.sign(prestr, MD5Key, "UTF-8");
+            prestr = prestr + "&sign_type=MD5";
+        } else if ("prod".equals(encryption)) {
+            // RSA加密
+            try {
+                sign = AlipaySignature.rsaSign(prestr, RSAPrivateKey, "utf-8", "RSA");
+            } catch (Exception e) {
+                logger.error("加密支付宝报关相关参数失败!", e);
+            }
+            prestr = prestr + "&sign_type=RSA";
+        }
+
+        try {
+            prestr = URLEncoder.encode(prestr, "utf-8") + "&sign=" + sign;
+        } catch (UnsupportedEncodingException e) {
+            logger.error("签名编码出现错误!", e);
+        }
         prestr = "?" + prestr;
         return prestr;
     }

+ 44 - 14
kmall-admin/src/main/java/com/kmall/admin/cuspay/biz/ali/AliCusDeclareQueryBiz.java

@@ -1,5 +1,6 @@
 package com.kmall.admin.cuspay.biz.ali;
 
+import com.alipay.api.internal.util.AlipaySignature;
 import com.kmall.admin.cuspay.biz.AbstractCusDeclareBiz;
 import com.kmall.admin.cuspay.biz.CuspayBiz;
 import com.kmall.admin.cuspay.ccnet2cuspay.common.ali.AliDict;
@@ -14,6 +15,7 @@ import com.kmall.admin.cuspay.common.core.db.IdWorkerAide;
 import com.kmall.admin.cuspay.entity.merch.MerchNoti;
 import com.kmall.admin.cuspay.entity.merch.MerchPayCfg;
 import com.kmall.admin.cuspay.service.MerchNotiService;
+import com.kmall.admin.cuspay.support.sign.RSA;
 import com.kmall.admin.cuspay.util.OkHttpUtils;
 import com.kmall.admin.cuspay.util.ReaderXmlForDOM4J;
 import com.kmall.admin.cuspay.util.XmlUtils;
@@ -41,12 +43,15 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
 import com.kmall.admin.cuspay.biz.ali.support.sign.MD5;
 
 import javax.xml.bind.JAXB;
 import java.io.IOException;
 import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
@@ -61,14 +66,14 @@ import java.util.*;
 public class AliCusDeclareQueryBiz extends AbstractCusDeclareBiz implements CuspayBiz {
     private static final Logger logger = LoggerFactory.getLogger(AliCusDeclareQueryBiz.class);
 
-//    @Value("${db.ali.declare.limit}")
-    private Integer limit = 20;
+    @Autowired
+    private Environment environment;
+
+    private Integer limit;
 
-//    @Value("${db.ali.declare.count}")
-    private Integer count = 2;
+    private Integer count;
 
-//    @Value("${ali.payment.query.url}")
-    private String queryURL = "https://mapi.alipay.com/gateway.do?";
+    private String queryURL;
 
     @Autowired
     private AliCbPayDocService aliCbPayDocService;
@@ -82,11 +87,12 @@ public class AliCusDeclareQueryBiz extends AbstractCusDeclareBiz implements Cusp
     /**
      * 微信订单信息查询
      */
+    @Override
     public void biz(Map<String, Object> params) {
-        // -------- TODO ALL ----
 
-        limit = (limit != null && limit > 0) ? limit : 20;
-        count = (count != null && count > 0) ? count : 10;
+        limit = Integer.parseInt(environment.getProperty("db.ali.declare.limit"));
+        count = Integer.parseInt(environment.getProperty("db.ali.declare.count"));
+        queryURL = environment.getProperty("ali.payment.query.url");
 
         //查出等待处理、业务处理中的支付单证信息
         List<AliCbPayDoc> aliCbPayDocs = null;
@@ -232,7 +238,7 @@ public class AliCusDeclareQueryBiz extends AbstractCusDeclareBiz implements Cusp
                             aliCbPayDoc.setDocStatus(AliDict.PaymentDocStatus.i_03.getItem());
                             this.aliCbPayDocService.updateAliCbPay(aliCbPayDoc);
                             merchNoti = builder.code(AliDict.ResponseMsgState.FAIL.getItem()).msg("未查询到报关请求号").cusDeclStatus(AliDict.MerchNoticeStatus.i_13.getItem()).certCheckResult(MerchNoticeDict.BuyerPayerCheckStatus.i_0.getItem()).build();
-                                                                                                  MerchNoti noti = new MerchNoti();
+                            MerchNoti noti = new MerchNoti();
                             noti.setNotiSn(builder.build().getNotiSn());
                             merchNoti.setNotiSn(builder.build().getNotiSn());
                             noti.setCode(aliCbPayDoc.getDetailErrorCode());
@@ -308,7 +314,11 @@ public class AliCusDeclareQueryBiz extends AbstractCusDeclareBiz implements Cusp
      * @param key2 Api密钥
      * @return
      */
-    protected static String assemblyDeclareQueryXml(AliCbPayDoc aliCbPayDoc, String key2) {
+    protected String assemblyDeclareQueryXml(AliCbPayDoc aliCbPayDoc, String key2) {
+        String MD5Key = environment.getProperty("ali.payment.md5.key");
+        String RSAPrivateKey = environment.getProperty("ali.payment.rsa.private-key");
+        String encryption = environment.getProperty("ali.payment.encryption");
+
         Map<String, String> paramMap = new HashMap<>();
         paramMap.put("_input_charset", "UTF-8");
         paramMap.put("out_request_nos", aliCbPayDoc.getOutRequestNo());
@@ -326,9 +336,29 @@ public class AliCusDeclareQueryBiz extends AbstractCusDeclareBiz implements Cusp
                 prestr = prestr + key + "=" + value + "&";
             }
         }
-        String sign = MD5.sign(prestr, "6zo20oar6qufb6x41ipli3yma9ju107h", "UTF-8");
-        prestr = prestr + "&sign_type=MD5";
-        prestr = prestr + "&sign=" + sign;
+
+        String sign = "";
+        // 判断环境
+        if ("dev".equals(encryption)) {
+            // MD5加密
+            sign = MD5.sign(prestr, MD5Key, "UTF-8");
+            prestr = prestr + "&sign_type=MD5";
+        } else if ("prod".equals(encryption)) {
+            // RSA加密
+            try {
+                sign = AlipaySignature.rsaSign(prestr, RSAPrivateKey, "utf-8", "RSA");
+//                sign = RSA.sign(prestr, RSAPrivateKey, "UTF-8");
+            } catch (Exception e) {
+                logger.error("加密支付宝查询报关结果相关参数失败!", e);
+            }
+            prestr = prestr + "&sign_type=RSA";
+        }
+
+        try {
+            prestr = URLEncoder.encode(prestr, "utf-8") + "&sign=" + sign;
+        } catch (UnsupportedEncodingException e) {
+            logger.error("签名编码出现错误!", e);
+        }
         prestr = "?" + prestr;
         return prestr;
     }

+ 2 - 2
kmall-admin/src/main/java/com/kmall/admin/cuspay/biz/wx/WxCusDeclareBiz.java

@@ -186,7 +186,7 @@ public class WxCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
         try {
             addWxCbPayDoc(wxCbPayDoc);
         } catch (Exception e) {
-            logger.error("微信支付单信息写入数据库失败:" + e.getMessage());
+            logger.error("微信支付单信息写入数据库失败:", e);
             return;
         }
         logger.info("微信支付单信息写入数据库结束");
@@ -232,7 +232,7 @@ public class WxCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
 
         WxResponseMsg wxResponseMsgDto = null;
         try {
-            // todo, 请求海关接口
+            // 请求海关接口
             String result = OkHttpUtils.post(request);
             StringReader reader = new StringReader(result);
             wxResponseMsgDto = JAXB.unmarshal(reader, WxResponseMsg.class);

+ 3 - 5
kmall-admin/src/main/java/com/kmall/admin/cuspay/support/sign/RSA.java

@@ -22,8 +22,7 @@ public class RSA{
 	* @param input_charset 编码格式
 	* @return 签名值
 	*/
-	public static String sign(String content, String privateKey, String input_charset)
-	{
+	public static String sign(String content, String privateKey, String input_charset) throws Exception {
         try 
         {
         	PKCS8EncodedKeySpec priPKCS8 	= new PKCS8EncodedKeySpec( Base64.decode(privateKey) );
@@ -42,10 +41,9 @@ public class RSA{
         }
         catch (Exception e)
         {
-        	e.printStackTrace();
+        	throw new Exception(e);
         }
-        
-        return null;
+
     }
 	
 	/**

+ 7 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/GoodsDao.java

@@ -3,6 +3,7 @@ package com.kmall.admin.dao;
 import com.kmall.admin.dto.GoodsDetailsDto;
 import com.kmall.admin.dto.GoodsPanoramaDto;
 import com.kmall.admin.entity.GoodsEntity;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
 import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import com.kmall.api.entity.exportpdf.PDFGoodsDto;
 import com.kmall.manager.dao.BaseDao;
@@ -28,6 +29,8 @@ public interface GoodsDao extends BaseDao<GoodsEntity> {
 
     GoodsEntity queryObjectByProdBarcodeAndBizType(@Param("prodBarcode")String prodBarcode, @Param("storeId")Integer storeId);
 
+    GoodsEntity queryObjectByProdBarcodeAndStoreId(@Param("prodBarcode")String prodBarcode, @Param("storeId")Integer storeId);
+
     GoodsEntity queryObjectByProdBarcodeAndStore(@Param("prodBarcode")String prodBarcode, @Param("storeId")Integer storeId);
 
     GoodsDetailsDto queryGoodsDetailsByProdBarcode(@Param("prodBarcode") String prodBarcode, @Param("storeId")String storeId, @Param("sku")String sku);
@@ -131,4 +134,8 @@ public interface GoodsDao extends BaseDao<GoodsEntity> {
      * @return
      */
     int updateStockNumberByProductCodeAndSku(GoodsEntity goodsEntity);
+
+    void updateStockNumberByOutbound(List<StockChangeRecordEntity> outboundList);
+
+    void updateStockNumberByStorage(List<StockChangeRecordEntity> storageList);
 }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/MkActivitiesPromotionDao.java

@@ -42,4 +42,6 @@ public interface MkActivitiesPromotionDao extends BaseDao<MkActivitiesPromotionE
      * @return 限时特价活动规则
      */
     List<MkActivitiesPromotionEntity> queryListByMkaIdAndStoreId(@Param("mkaId") int mkaId, @Param("storeId") String storeId);
+
+    void deleteBatchByMkaId(@Param("mkaId") int mkaId);
 }

+ 4 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/ProductStoreRelaDao.java

@@ -4,6 +4,7 @@ import com.kmall.admin.dto.Mall2RulesDto;
 import com.kmall.admin.entity.ProductStoreRelaEntity;
 import com.kmall.admin.entity.StoreEntity;
 import com.kmall.admin.entity.StoreTransferInventoryOrderDetailEntity;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
 import com.kmall.admin.entity.vip.Mall2DetilEntity;
 import org.apache.ibatis.annotations.Param;
 import com.kmall.manager.dao.BaseDao;
@@ -119,4 +120,7 @@ public interface ProductStoreRelaDao extends BaseDao<ProductStoreRelaEntity> {
 
     ProductStoreRelaEntity queryByGoodsIdAndStoreIdHkMall(@Param("storeId") Long storeId, @Param("goodsId") Long goodsId);
 
+    void updateStockNumberByOutbound(List<StockChangeRecordEntity> outboundList);
+
+    void updateStockNumberByStorage(List<StockChangeRecordEntity> storageList);
 }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/haikong/HaiKongSendOrderInfoRecordDao.java

@@ -37,4 +37,6 @@ public interface HaiKongSendOrderInfoRecordDao {
     int saveBatch(List<HaiKongSendOrderInfoRecordEntity> entities);
 
     void updateResendStatusBatch(List<HaiKongSendOrderInfoRecordEntity> entities);
+
+    void updateByOrderSn(HaiKongSendOrderInfoRecordEntity sendOrderInfoRecordEntity);
 }

+ 30 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/haikong/StockChangeDao.java

@@ -0,0 +1,30 @@
+package com.kmall.admin.dao.haikong;
+
+import com.kmall.admin.entity.haikong.StockChangeEntity;
+import com.kmall.manager.dao.BaseDao;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-29 14:46:49
+ */
+public interface StockChangeDao extends BaseDao<StockChangeEntity> {
+
+    /**
+     * 更新审核状态
+     * @param map
+     *  ids         要更新的数据
+     *  auditBy     修改人
+     *  auditTime   修改时间
+     *  type        状态
+     */
+    void updateAuditStatus(@Param("map")Map map,@Param("ids")String[] ids);
+
+    List<StockChangeEntity> queryListByIds(String... ids);
+}

+ 37 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/haikong/StockChangeRecordDao.java

@@ -0,0 +1,37 @@
+package com.kmall.admin.dao.haikong;
+
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 海控出入库单记录Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-27 16:21:47
+ */
+public interface StockChangeRecordDao {
+
+
+    StockChangeRecordEntity queryObject(Integer id);
+
+    List<StockChangeRecordEntity> queryList(Map<String, Object> map);
+
+    int queryTotal(Map<String, Object> map);
+
+    int save(StockChangeRecordEntity stockChangeRecord);
+
+    int update(StockChangeRecordEntity stockChangeRecord);
+
+    int delete(Integer id);
+
+    int deleteBatch(Integer[] ids);
+
+    void saveBatch(List<StockChangeRecordEntity> stockChangeRecordEntities);
+
+    List<StockChangeRecordEntity> queryListByParentIds(List<String> stringList);
+
+    void deleteBatchByParentIds(String[] ids);
+}

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/mk/MkActivitiesAssociationDao.java

@@ -23,4 +23,6 @@ public interface MkActivitiesAssociationDao extends BaseDao<MkActivitiesAssociat
     int updateByMkaId(MkActivitiesAssociationEntity mkActivitiesAssociationEntity);
 
     MkActivitiesAssociationEntity queryByMkCodeAndTopic(@Param("mkCode") String mkCode, @Param("mkaTopic") String mkaTopic, @Param("mkaStoreId") String mkaStoreId);
+
+    void deleteByMkaId(@Param("mkaId") Long mkaId);
 }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/mk/MkActivitiesDao.java

@@ -34,4 +34,6 @@ public interface MkActivitiesDao extends BaseDao<MkActivitiesEntity> {
      * @return 满赠活动列表
      */
     List<MkActivitiesEntity> queryByNowByMz(@Param("storeId") String storeId, @Param("currentTime") String currentTime);
+
+    List<MkActivitiesEntity> queryListByMkaIdList(List<Integer> mkaIdList);
 }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/mk/MkActivitiesScoreDao.java

@@ -28,4 +28,6 @@ public interface MkActivitiesScoreDao extends BaseDao<MkActivitiesScoreEntity> {
      * @return 活动
      */
     List<MkActivitiesScoreEntity> queryActivityInfoByMkaIdList(List<Long> mkaIdList);
+
+    void deleteBatchByMkaId(@Param("mkaId") int mkaId);
 }

+ 83 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/StockChangeDto.java

@@ -0,0 +1,83 @@
+package com.kmall.admin.dto;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author lhm
+ * @createDate 2021-12-29
+ */
+public class StockChangeDto implements Serializable {
+
+    private static final long serialVersionUID = 684865635636920L;
+
+    private String id;
+
+    private String merchSn;
+
+    private String thirdMerchSn;
+
+    private Integer storeId;
+
+    private String type;
+
+    private String remark;
+
+    private String time;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getMerchSn() {
+        return merchSn;
+    }
+
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn;
+    }
+
+    public String getThirdMerchSn() {
+        return thirdMerchSn;
+    }
+
+    public void setThirdMerchSn(String thirdMerchSn) {
+        this.thirdMerchSn = thirdMerchSn;
+    }
+
+    public Integer getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+}

+ 65 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/StockChangeRecordDto.java

@@ -0,0 +1,65 @@
+package com.kmall.admin.dto;
+
+import java.io.Serializable;
+
+/**
+ * @author lhm
+ * @createDate 2021-12-27
+ */
+public class StockChangeRecordDto implements Serializable {
+
+    private static final long serialVersionUID = 199865635636920L;
+
+    private String sku;
+
+    private Integer number;
+
+    private String orderSn;
+
+    /**
+     * 快递单号
+     */
+    private String courierNumber;
+
+    private String remark;
+
+    public String getSku() {
+        return sku;
+    }
+
+    public void setSku(String sku) {
+        this.sku = sku;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public String getOrderSn() {
+        return orderSn;
+    }
+
+    public void setOrderSn(String orderSn) {
+        this.orderSn = orderSn;
+    }
+
+    public String getCourierNumber() {
+        return courierNumber;
+    }
+
+    public void setCourierNumber(String courierNumber) {
+        this.courierNumber = courierNumber;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+}

+ 23 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/OrderGoodsEntity.java

@@ -81,6 +81,21 @@ public class OrderGoodsEntity implements Serializable {
 	 */
 	private Integer deductionScore;
 
+
+	/**
+	 * 积分抵扣金额
+	 */
+	private BigDecimal deductionPrice;
+
+
+	public BigDecimal getDeductionPrice() {
+		return deductionPrice;
+	}
+
+	public void setDeductionPrice(BigDecimal deductionPrice) {
+		this.deductionPrice = deductionPrice;
+	}
+
 	public String getPlu() {
 		return plu;
 	}
@@ -381,4 +396,12 @@ public class OrderGoodsEntity implements Serializable {
 	public void setTaxPrice(BigDecimal taxPrice) {
 		this.taxPrice = taxPrice;
 	}
+
+	public Integer getDeductionScore() {
+		return deductionScore;
+	}
+
+	public void setDeductionScore(Integer deductionScore) {
+		this.deductionScore = deductionScore;
+	}
 }

+ 18 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongMemberOrderSyncResendEntity.java

@@ -1,5 +1,7 @@
 package com.kmall.admin.entity.haikong;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -54,10 +56,26 @@ public class HaiKongMemberOrderSyncResendEntity {
     /**
      * 最后一次重发时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
     private Date lastResendTime;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
     private Date createTime;
 
+
+    /**
+     * 订单id
+     */
+    private String orderId;
+
+    public String getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(String orderId) {
+        this.orderId = orderId;
+    }
+
     public Integer getId() {
         return id;
     }

+ 3 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongMemberScoreChangeRecordEntity.java

@@ -1,5 +1,6 @@
 package com.kmall.admin.entity.haikong;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.kmall.admin.haikong.constant.HaiKongMemberScoreChangeEventEnum;
 
 import java.util.Date;
@@ -46,8 +47,10 @@ public class HaiKongMemberScoreChangeRecordEntity {
      */
     private String statementId;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
     private Date createTime;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
     private Date modifyTime;
 
     /**

+ 365 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/StockChangeEntity.java

@@ -0,0 +1,365 @@
+package com.kmall.admin.entity.haikong;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 实体
+ * 表名 mall_stock_change
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-29 14:46:49
+ */
+public class StockChangeEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 出、入库单单号,手动录入
+     */
+    private String id;
+    /**
+     * 出、入库类型,0:普通入库 1:调拨入库 2:销售出库 3:普通出库 4:调拨出库
+     */
+    private String type;
+    /**
+     * 出、入库时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    private Date time;
+    /**
+     * 商户编号
+     */
+    private String merchSn;
+    /**
+     * 商户名称
+     */
+    private String merch;
+    /**
+     * 门店id
+     */
+    private Integer storeId;
+    /**
+     * 门店名称
+     */
+    private String store;
+    /**
+     * 第三方商户
+     */
+    private String thirdMerchSn;
+    /**
+     * 审核状态,0:待审核 1:审核成功 2:审核拒绝
+     */
+    private String audit;
+    /**
+     * 第三方商户名称
+     */
+    private String thirdMerch;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 创建人
+     */
+    private String createBy;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    private Date createTime;
+    /**
+     * 修改人
+     */
+    private String modifyBy;
+    /**
+     * 修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    private Date modifyTime;
+    /**
+     * 审核人
+     */
+    private String auditBy;
+    /**
+     * 审核时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    private Date auditTime;
+    /**
+     * 规格
+     */
+
+    private String specification;
+    /**
+     * 商品名称
+     */
+
+    private String product;
+
+    public String getSpecification() {
+        return specification;
+    }
+
+    public void setSpecification(String specification) {
+        this.specification = specification;
+    }
+
+    public String getProduct() {
+        return product;
+    }
+
+    public void setProduct(String product) {
+        this.product = product;
+    }
+
+    /**
+     * 设置:出、入库单单号,手动录入
+     */
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:出、入库单单号,手动录入
+     */
+    public String getId() {
+        return id;
+    }
+    /**
+     * 设置:出、入库类型,0:普通入库 1:调拨入库 2:销售出库 3:普通出库 4:调拨出库
+     */
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /**
+     * 获取:出、入库类型,0:普通入库 1:调拨入库 2:销售出库 3:普通出库 4:调拨出库
+     */
+    public String getType() {
+        return type;
+    }
+    /**
+     * 设置:出、入库时间
+     */
+    public void setTime(Date time) {
+        this.time = time;
+    }
+
+    /**
+     * 获取:出、入库时间
+     */
+    public Date getTime() {
+        return time;
+    }
+    /**
+     * 设置:商户编号
+     */
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn;
+    }
+
+    /**
+     * 获取:商户编号
+     */
+    public String getMerchSn() {
+        return merchSn;
+    }
+    /**
+     * 设置:商户名称
+     */
+    public void setMerch(String merch) {
+        this.merch = merch;
+    }
+
+    /**
+     * 获取:商户名称
+     */
+    public String getMerch() {
+        return merch;
+    }
+    /**
+     * 设置:门店id
+     */
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    /**
+     * 获取:门店id
+     */
+    public Integer getStoreId() {
+        return storeId;
+    }
+    /**
+     * 设置:门店名称
+     */
+    public void setStore(String store) {
+        this.store = store;
+    }
+
+    /**
+     * 获取:门店名称
+     */
+    public String getStore() {
+        return store;
+    }
+    /**
+     * 设置:第三方商户
+     */
+    public void setThirdMerchSn(String thirdMerchSn) {
+        this.thirdMerchSn = thirdMerchSn;
+    }
+
+    /**
+     * 获取:第三方商户
+     */
+    public String getThirdMerchSn() {
+        return thirdMerchSn;
+    }
+    /**
+     * 设置:审核状态,0:待审核 1:审核成功 2:审核拒绝
+     */
+    public void setAudit(String audit) {
+        this.audit = audit;
+    }
+
+    /**
+     * 获取:审核状态,0:待审核 1:审核成功 2:审核拒绝
+     */
+    public String getAudit() {
+        return audit;
+    }
+    /**
+     * 设置:第三方商户名称
+     */
+    public void setThirdMerch(String thirdMerch) {
+        this.thirdMerch = thirdMerch;
+    }
+
+    /**
+     * 获取:第三方商户名称
+     */
+    public String getThirdMerch() {
+        return thirdMerch;
+    }
+    /**
+     * 设置:备注
+     */
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    /**
+     * 获取:备注
+     */
+    public String getRemark() {
+        return remark;
+    }
+    /**
+     * 设置:创建人
+     */
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    /**
+     * 获取:创建人
+     */
+    public String getCreateBy() {
+        return createBy;
+    }
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人
+     */
+    public void setModifyBy(String modifyBy) {
+        this.modifyBy = modifyBy;
+    }
+
+    /**
+     * 获取:修改人
+     */
+    public String getModifyBy() {
+        return modifyBy;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setModifyTime(Date modifyTime) {
+        this.modifyTime = modifyTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getModifyTime() {
+        return modifyTime;
+    }
+    /**
+     * 设置:审核人
+     */
+    public void setAuditBy(String auditBy) {
+        this.auditBy = auditBy;
+    }
+
+    /**
+     * 获取:审核人
+     */
+    public String getAuditBy() {
+        return auditBy;
+    }
+    /**
+     * 设置:审核时间
+     */
+    public void setAuditTime(Date auditTime) {
+        this.auditTime = auditTime;
+    }
+
+    /**
+     * 获取:审核时间
+     */
+    public Date getAuditTime() {
+        return auditTime;
+    }
+
+    @Override
+    public String toString() {
+        return "StockChangeEntity{" +
+                "id='" + id + '\'' +
+                ", type='" + type + '\'' +
+                ", time=" + time +
+                ", merchSn='" + merchSn + '\'' +
+                ", merch='" + merch + '\'' +
+                ", storeId=" + storeId +
+                ", store='" + store + '\'' +
+                ", thirdMerchSn='" + thirdMerchSn + '\'' +
+                ", audit='" + audit + '\'' +
+                ", thirdMerch='" + thirdMerch + '\'' +
+                ", remark='" + remark + '\'' +
+                ", createBy='" + createBy + '\'' +
+                ", createTime=" + createTime +
+                ", modifyBy='" + modifyBy + '\'' +
+                ", modifyTime=" + modifyTime +
+                ", auditBy='" + auditBy + '\'' +
+                ", auditTime=" + auditTime +
+                ", specification='" + specification + '\'' +
+                ", product='" + product + '\'' +
+                '}';
+    }
+}

+ 198 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/StockChangeRecordEntity.java

@@ -0,0 +1,198 @@
+package com.kmall.admin.entity.haikong;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 海控出入库单记录实体
+ * 表名 mall_stock_change_record
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-27 16:21:47
+ */
+public class StockChangeRecordEntity implements Serializable {
+    private static final long serialVersionUID = 987816484146341651L;
+
+    /**
+     * 
+     */
+    private Integer id;
+    private Integer specification;
+    private String product;
+    private String merchSn;
+    private String thirdMerchSn;
+    private Integer storeId;
+    private String parentId;
+    private String orderSn;
+    private String courierNumber;
+    /**
+     * sku
+     */
+    private String sku;
+    /**
+     * 记录类型,0:出库 1:入库 2:销售出库
+     */
+    private String type;
+    /**
+     * 出库或入库数量
+     */
+    private Integer number;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    private Date createTime;
+    /**
+     * 
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    private Date modifyTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getSpecification() {
+        return specification;
+    }
+
+    public void setSpecification(Integer specification) {
+        this.specification = specification;
+    }
+
+    public String getProduct() {
+        return product;
+    }
+
+    public void setProduct(String product) {
+        this.product = product;
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getOrderSn() {
+        return orderSn;
+    }
+
+    public void setOrderSn(String orderSn) {
+        this.orderSn = orderSn;
+    }
+
+    public String getCourierNumber() {
+        return courierNumber;
+    }
+
+    public void setCourierNumber(String courierNumber) {
+        this.courierNumber = courierNumber;
+    }
+
+    public String getSku() {
+        return sku;
+    }
+
+    public void setSku(String sku) {
+        this.sku = sku;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getModifyTime() {
+        return modifyTime;
+    }
+
+    public void setModifyTime(Date modifyTime) {
+        this.modifyTime = modifyTime;
+    }
+
+    public String getMerchSn() {
+        return merchSn;
+    }
+
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn;
+    }
+
+    public String getThirdMerchSn() {
+        return thirdMerchSn;
+    }
+
+    public void setThirdMerchSn(String thirdMerchSn) {
+        this.thirdMerchSn = thirdMerchSn;
+    }
+
+    public Integer getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    @Override
+    public String toString() {
+        return "StockChangeRecordEntity{" +
+                "id=" + id +
+                ", specification=" + specification +
+                ", product='" + product + '\'' +
+                ", merchSn='" + merchSn + '\'' +
+                ", thirdMerchSn='" + thirdMerchSn + '\'' +
+                ", storeId=" + storeId +
+                ", parentId='" + parentId + '\'' +
+                ", orderSn='" + orderSn + '\'' +
+                ", courierNumber='" + courierNumber + '\'' +
+                ", sku='" + sku + '\'' +
+                ", type='" + type + '\'' +
+                ", number=" + number +
+                ", remark='" + remark + '\'' +
+                ", createTime=" + createTime +
+                ", modifyTime=" + modifyTime +
+                '}';
+    }
+}

+ 3 - 3
kmall-admin/src/main/java/com/kmall/admin/haikong/client/HaiKongMemberTemplate.java

@@ -108,7 +108,7 @@ public class HaiKongMemberTemplate {
                             .build();
 
         String response = OkHttpUtils.retry(request, haiKongProperties.getRetry());
-        log.info("请求获取accessToken接口成功......");
+        log.info("请求获取accessToken接口成功......" + response);
         return response;
     }
 
@@ -125,7 +125,7 @@ public class HaiKongMemberTemplate {
                             .url(url)
                             .build();
         String response = OkHttpUtils.retry(request, haiKongProperties.getRetry());
-        log.info("请求刷新accessToken接口成功......");
+        log.info("请求刷新accessToken接口成功......返回数据 " + response);
         return response;
     }
 
@@ -144,7 +144,7 @@ public class HaiKongMemberTemplate {
                             .url(url)
                             .build();
         String response = OkHttpUtils.retry(request, haiKongProperties.getRetry());
-        log.info("请求根据手机号获取会员信息接口成功......");
+        log.info("请求根据手机号获取会员信息接口成功......" + response);
         return response;
     }
 

+ 69 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/constant/Constants.java

@@ -334,4 +334,73 @@ public class Constants {
         }
     }
 
+    /**
+     * 0:普通入库
+     * 1:调拨入库
+     * 2:销售出库(下单时自动写入明细,不需要导入)
+     * 3:普通出库
+     * 4:调拨出库
+     */
+    public enum StockChangeType {
+        /**
+         * 普通入库
+         */
+        item_0("0", "普通入库"),
+        /**
+         * 调拨入库
+         */
+        item_1("1", "调拨入库"),
+        /**
+         * 销售出库
+         */
+        item_2("2", "销售出库"),
+        item_3("3", "普通出库"),
+        item_4("4", "调拨出库"),
+        ;
+
+        private final String type;
+
+        private final String desc;
+
+        StockChangeType(String type, String desc) {
+            this.type = type;
+            this.desc = desc;
+        }
+
+        public String getType() {
+            return type;
+        }
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
+    /**
+     * 审核状态,0:待审核 1:审核成功 2:审核拒绝
+     */
+    public enum AuditStatus {
+        WAIT_AUDIT("0", "待审核"),
+        AUDIT_SUCCESS("1", "审核成功"),
+        AUDIT_REJECT("2", "审核拒绝"),
+        ;
+
+        private final String type;
+
+        private final String desc;
+
+        AuditStatus(String type, String desc) {
+            this.type = type;
+            this.desc = desc;
+        }
+
+        public String getType() {
+            return type;
+        }
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
 }

+ 15 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/dto/MemberOrderInfoSyncDTO.java

@@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 会员消费订单同步接口
@@ -63,6 +64,20 @@ public class MemberOrderInfoSyncDTO implements Serializable {
     @JsonProperty("order_score")
     private Integer orderScore;
 
+    /**
+     * 订单中的商品明细集合
+     */
+    @JsonProperty("item_info_list")
+    private List itemInfoList;
+
+    public List getItemInfoList() {
+        return itemInfoList;
+    }
+
+    public void setItemInfoList(List itemInfoList) {
+        this.itemInfoList = itemInfoList;
+    }
+
     public Long getStoreId() {
         return storeId;
     }

+ 30 - 5
kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberOrderSyncResendTask.java

@@ -1,6 +1,7 @@
 package com.kmall.admin.haikong.task;
 
 import com.fasterxml.jackson.core.type.TypeReference;
+import com.kmall.admin.entity.OrderGoodsEntity;
 import com.kmall.admin.entity.haikong.HaiKongMemberOrderSyncResendEntity;
 import com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity;
 import com.kmall.admin.haikong.client.HaiKongMemberTemplate;
@@ -10,6 +11,7 @@ import com.kmall.admin.haikong.dto.MemberOrderInfoSyncDTO;
 import com.kmall.admin.haikong.dto.MemberScoreChangeDTO;
 import com.kmall.admin.haikong.dto.MemberScoreChangeResponseDTO;
 import com.kmall.admin.haikong.utils.Response;
+import com.kmall.admin.service.OrderGoodsService;
 import com.kmall.admin.service.haikong.HaiKongMemberOrderSyncResendService;
 import com.kmall.admin.utils.jackson.JacksonUtil;
 import org.slf4j.Logger;
@@ -20,10 +22,7 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * 重发会员消费订单同步定时任务
@@ -39,6 +38,9 @@ public class MemberOrderSyncResendTask {
     private HaiKongMemberTemplate haiKongMemberTemplate;
 
     @Autowired
+    private OrderGoodsService orderGoodsService;
+
+    @Autowired
     private HaiKongMemberOrderSyncResendService haiKongMemberOrderSyncResendService;
 
     @Scheduled(cron = "0 0/2 * * * ?")
@@ -52,6 +54,27 @@ public class MemberOrderSyncResendTask {
         List<HaiKongMemberOrderSyncResendEntity> failedList = new ArrayList<>();
         haiKongMemberOrderSyncResendEntities.forEach(haiKongMemberOrderSyncResendEntity -> {
             MemberOrderInfoSyncDTO memberOrderInfoSyncDTO = new MemberOrderInfoSyncDTO();
+            //新增传给海控会员系统添加商品明细
+            HashMap<String, Object> orderIdMap = new HashMap<>();
+            orderIdMap.put("orderId",haiKongMemberOrderSyncResendEntity.getOrderId());
+            List<OrderGoodsEntity> orderGoodsEntities = orderGoodsService.queryList(orderIdMap);
+            List list = new ArrayList<Map>();
+            for (OrderGoodsEntity orderGoodsEntity : orderGoodsEntities) {
+                HashMap<Object, Object> map = new HashMap<>();
+                map.put("item_no",orderGoodsEntity.getSku());//商品编码
+                map.put("item_name",orderGoodsEntity.getGoodsName());//名称
+                map.put("item_price",orderGoodsEntity.getActualPaymentAmount());//商品实际支付金额
+                //会员系统那边开发可不传这两个字段
+//            map.put("add_score");//商品基础积分
+//            map.put("active_score",);//商品活动积分
+                map.put("use_score",orderGoodsEntity.getDeductionScore());//商品使用积分抵扣
+                map.put("deduction_money",orderGoodsEntity.getDeductionPrice());//商品积分抵扣金额
+                map.put("item_num",orderGoodsEntity.getNumber());//商品数量
+                list.add(map);
+            }
+            memberOrderInfoSyncDTO.setItemInfoList(list);
+
+
             BeanUtils.copyProperties(haiKongMemberOrderSyncResendEntity, memberOrderInfoSyncDTO);
             String body = JacksonUtil.toJson(memberOrderInfoSyncDTO);
             haiKongMemberOrderSyncResendEntity.setLastResendTime(new Date());
@@ -74,7 +97,9 @@ public class MemberOrderSyncResendTask {
                     log.error("【重发】请求会员消费订单同步接口失败!响应:{}", responseJson);
                 }
             } catch (Exception e) {
-                haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
+//                lhm 重发状态是修改成无需重发应修改为重发失败供定时器去重发
+//                haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
+                haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_FAILED.getStatus());
                 failedList.add(haiKongMemberOrderSyncResendEntity);
                 log.error("【重发】请求会员消费订单同步接口失败!异常:", e);
             }

+ 11 - 5
kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberSysAccessTokenRefreshTask.java

@@ -32,13 +32,15 @@ public class MemberSysAccessTokenRefreshTask {
     private HaiKongMemberTemplate haiKongMemberTemplate;
 
 
-    @Scheduled(cron = "0/30 * * * * ?")
+    @Scheduled(cron = "0 0 0 1/3 * ? ")
     public void refresh() {
         String refreshToken = JedisUtil.get(Constants.MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY);
         String accessToken = JedisUtil.get(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY);
-        if (!StringUtils.isEmpty(refreshToken) && !StringUtils.isEmpty(accessToken)) {
-            return;
-        }
+        log.info("refresh accessToken......" + accessToken);
+        log.info("refresh refreshToken......" + refreshToken);
+//        if (!StringUtils.isEmpty(refreshToken) && !StringUtils.isEmpty(accessToken)) {
+//            return;
+//        }
         boolean a = false;
         if (StringUtils.isEmpty(refreshToken)) {
             try {
@@ -50,7 +52,7 @@ public class MemberSysAccessTokenRefreshTask {
             } catch (Exception e) {
                 log.error(e.getMessage() + "====>", e);
             }
-        } else if (StringUtils.isEmpty(accessToken) && !StringUtils.isEmpty(refreshToken)) {
+        } else if (!StringUtils.isEmpty(refreshToken)) {
             try {
                 String refreshAccessTokenJson = haiKongMemberTemplate.refreshAccessToken(refreshToken);
                 handleResponse(refreshAccessTokenJson, a);
@@ -62,6 +64,7 @@ public class MemberSysAccessTokenRefreshTask {
     }
 
     private void handleResponse(String json, Boolean a) {
+        log.debug("重新设置accessToken" + json + "!" + a);
         Response<AccessTokenDTO> response = null;
         try {
             response = JacksonUtil.getObjectMapper().readValue(json, new TypeReference<Response<AccessTokenDTO>>() {
@@ -73,7 +76,9 @@ public class MemberSysAccessTokenRefreshTask {
         if (Objects.nonNull(response) && response.getSuccess()) {
             AccessTokenDTO accessTokenDTO = response.getData();
             JedisUtil.del(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY);
+            log.debug("删除accessToken");
             JedisUtil.set(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY, JacksonUtil.toJson(accessTokenDTO), (60 * 60 * 2) - (60 * 10));
+            log.debug("写入新的accessToken");
             if (a) {
                 JedisUtil.del(Constants.MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY);
                 JedisUtil.set(Constants.MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY, Optional.ofNullable(accessTokenDTO.getRefreshToken()).orElse(""), (60 * 60 * 24 * 7));
@@ -90,6 +95,7 @@ public class MemberSysAccessTokenRefreshTask {
 
     public String getAccessToken() throws Exception {
         String accessTokenJson = JedisUtil.get(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY);
+        log.info("getAccessToken accessToken......" + accessTokenJson);
         if (StringUtils.isEmpty(accessTokenJson)) {
             refresh();
             accessTokenJson = JedisUtil.get(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY);

+ 11 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/vo/CalculateOrderDiscountPriceVO.java

@@ -15,6 +15,8 @@ public class CalculateOrderDiscountPriceVO {
 
     private String memberCode;
 
+    private Boolean useScore;
+
     private List<GoodsDetailsDto> goodsList;
 
     public CalculateOrderDiscountPriceVO() {
@@ -50,11 +52,20 @@ public class CalculateOrderDiscountPriceVO {
         this.goodsList = goodsList;
     }
 
+    public Boolean getUseScore() {
+        return useScore;
+    }
+
+    public void setUseScore(Boolean useScore) {
+        this.useScore = useScore;
+    }
+
     @Override
     public String toString() {
         return "CalculateOrderDiscountPriceVO{" +
                 "storeId='" + storeId + '\'' +
                 ", memberCode='" + memberCode + '\'' +
+                ", useScore='" + useScore + '\'' +
                 ", goodsList=" + goodsList +
                 '}';
     }

+ 15 - 0
kmall-admin/src/main/java/com/kmall/admin/service/GoodsService.java

@@ -5,6 +5,7 @@ import com.kmall.admin.dto.GoodsDto;
 import com.kmall.admin.dto.GoodsPanoramaDto;
 import com.kmall.admin.entity.GoodsEntity;
 import com.kmall.admin.entity.TaxErrorRecordEntity;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import com.kmall.api.entity.exportpdf.PDFGoodsDto;
@@ -30,6 +31,8 @@ public interface GoodsService {
     GoodsEntity queryObject(Integer id);
 
     GoodsEntity queryObjectByProdBarcodeAndBizType(String prodBarcode, Integer storeId);
+
+    GoodsEntity queryObjectByProdBarcodeAndStoreId(String prodBarcode, Integer storeId);
     /**
      * 分页查询
      *
@@ -252,4 +255,16 @@ public interface GoodsService {
     int updateStockNumberByProductCodeAndSku(GoodsEntity goodsEntity);
 
     void validateWarehouseStock(GoodsDetailsDto goods, String prodBarcode, String sku, String storeId);
+
+    /**
+     * 出库单更新库存(扣减)
+     * @param outboundList  出库sku
+     */
+    void updateStockNumberByOutbound(List<StockChangeRecordEntity> outboundList);
+
+    /**
+     * 入库单更新库存(增加)
+     * @param storageList   入库sku
+     */
+    void updateStockNumberByStorage(List<StockChangeRecordEntity> storageList);
 }

+ 3 - 0
kmall-admin/src/main/java/com/kmall/admin/service/MerchService.java

@@ -69,4 +69,7 @@ public interface MerchService {
      * @return 删除条数
      */
     int deleteBatch(Integer[] ids);
+
+    MerchEntity queryByMerchSn(String merchSn);
+
 }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/service/MkActivitiesPromotionService.java

@@ -112,4 +112,6 @@ public interface MkActivitiesPromotionService {
      * @return      限时特价活动规则
      */
     List<MkActivitiesPromotionEntity> queryListByMkaIdAndStoreId(int mkaId, String storeId);
+
+    void deleteBatchByMkaId(int mkaId);
 }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/service/MngChangeService.java

@@ -69,4 +69,6 @@ public interface MngChangeService {
      * @return 删除条数
      */
     int deleteBatch(Integer[] ids);
+
+    void saveBatch(List<MngChangeEntity> changeEntityList);
 }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/service/OrderService.java

@@ -258,4 +258,6 @@ public interface OrderService {
     void integralTask();
 
     int queryOrderMainTotal();
+
+    R resendOrderInfoToVmcShop(String orderSn);
 }

+ 13 - 0
kmall-admin/src/main/java/com/kmall/admin/service/ProductStoreRelaService.java

@@ -3,6 +3,7 @@ package com.kmall.admin.service;
 import com.kmall.admin.dto.StoreGoodsDto;
 import com.kmall.admin.entity.ProductStoreRelaEntity;
 import com.kmall.admin.entity.StoreTransferInventoryOrderDetailEntity;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
 
 import java.util.List;
 import java.util.Map;
@@ -163,4 +164,16 @@ public interface ProductStoreRelaService {
      * @param productStoreRelaEntity    门店库存实体
      */
     void updateStockNumByStoreIdAndSku(ProductStoreRelaEntity productStoreRelaEntity);
+
+    /**
+     * 出库单更新库存(扣减)
+     * @param outboundList  出库sku
+     */
+    void updateStockNumberByOutbound(List<StockChangeRecordEntity> outboundList);
+
+    /**
+     * 入库单更新库存(增加)
+     * @param storageList   入库sku
+     */
+    void updateStockNumberByStorage(List<StockChangeRecordEntity> storageList);
 }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/service/StoreMngChangeService.java

@@ -69,4 +69,6 @@ public interface StoreMngChangeService {
      * @return 删除条数
      */
     int deleteBatch(Integer[] ids);
+
+    void saveBatch(List<StoreMngChangeEntity> mngChangeEntityList);
 }

+ 4 - 0
kmall-admin/src/main/java/com/kmall/admin/service/haikong/HaiKongSendOrderInfoRecordService.java

@@ -76,4 +76,8 @@ public interface HaiKongSendOrderInfoRecordService {
     List<HaiKongSendOrderInfoRecordEntity> queryListByResendStatus();
 
     void updateResendStatusBatch(List<HaiKongSendOrderInfoRecordEntity> entities);
+
+    HaiKongSendOrderInfoRecordEntity queryObjectByOrderSn(String orderSn);
+
+    void updateByOrderSn(HaiKongSendOrderInfoRecordEntity sendOrderInfoRecordEntity);
 }

+ 90 - 0
kmall-admin/src/main/java/com/kmall/admin/service/haikong/StockChangeRecordService.java

@@ -0,0 +1,90 @@
+package com.kmall.admin.service.haikong;
+
+
+import com.kmall.admin.dto.StockChangeRecordDto;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 海控出入库单记录Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-27 16:21:47
+ */
+public interface StockChangeRecordService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param id 主键
+     * @return 实体
+     */
+    StockChangeRecordEntity queryObject(Integer id);
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<StockChangeRecordEntity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体,修改库存
+     *
+     * @param stockChangeRecord 实体
+     * @return 保存条数
+     */
+    int save(StockChangeRecordEntity stockChangeRecord);
+
+    /**
+     * 根据主键更新实体,修改库存
+     *
+     * @param stockChangeRecord 实体
+     * @return 更新条数
+     */
+    int update(StockChangeRecordEntity stockChangeRecord);
+
+    /**
+     * 根据主键删除
+     *
+     * @param id
+     * @return 删除条数
+     */
+    int delete(Integer id);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param ids
+     * @return 删除条数
+     */
+    int deleteBatch(Integer[]ids);
+
+    void uploadExcel(List<StockChangeRecordDto> stockChangeRecordDtos);
+
+    /**
+     * 导入,需要修改库存
+     */
+    void saveBatch(List<StockChangeRecordEntity> stockChangeRecordEntities);
+
+    /**
+     * 订单提交时进行保存,不修改库存
+     */
+    void saveBatchByOrderSubmit(List<StockChangeRecordEntity> stockChangeRecordEntities);
+
+    List<StockChangeRecordEntity> queryListByParentIds(List<String> stringList);
+
+    void deleteBatchByParentIds(String[] ids);
+}

+ 85 - 0
kmall-admin/src/main/java/com/kmall/admin/service/haikong/StockChangeService.java

@@ -0,0 +1,85 @@
+package com.kmall.admin.service.haikong;
+
+import com.kmall.admin.dto.StockChangeDto;
+import com.kmall.admin.dto.StockChangeRecordDto;
+import com.kmall.admin.entity.haikong.StockChangeEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-29 14:46:49
+ */
+public interface StockChangeService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param id 主键
+     * @return 实体
+     */
+    StockChangeEntity queryObject(String id);
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<StockChangeEntity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param stockChange 实体
+     * @return 保存条数
+     */
+    int save(StockChangeEntity stockChange);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param stockChange 实体
+     * @return 更新条数
+     */
+    int update(StockChangeEntity stockChange);
+
+    /**
+     * 根据主键删除
+     *
+     * @param id
+     * @return 删除条数
+     */
+    int delete(String id);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param ids
+     * @return 删除条数
+     */
+    int deleteBatch(String[]ids);
+
+    void uploadExcel(List<StockChangeRecordDto> stockChangeRecordDtos, StockChangeDto stockChangeDto);
+
+    /**
+     * 更新审核状态
+     * @param ids   要更新的数据
+     * @param type  状态
+     */
+    void updateAuditStatus(String[] ids, String type);
+
+    List<StockChangeEntity> queryListByIds(String[] ids);
+}

+ 81 - 1
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -10,6 +10,7 @@ import com.kmall.admin.dto.GoodsDetailsDto;
 import com.kmall.admin.dto.GoodsDto;
 import com.kmall.admin.dto.GoodsPanoramaDto;
 import com.kmall.admin.entity.*;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
 import com.kmall.admin.entity.kmall2eccs.KtoEccsEntity;
 import com.kmall.admin.entity.mk.MkActivitiesEntity;
 import com.kmall.admin.entity.shop.ShopErrorPriceRecordEntity;
@@ -131,6 +132,8 @@ public class GoodsServiceImpl implements GoodsService {
     private MkActivitiesHalfPriceService halfPriceService; // 第二份半价
     @Autowired
     private BrandService brandService;
+    @Autowired
+    private MngChangeService mngChangeService;
 
     @Autowired
     private ShopErrorPriceRecordService shopErrorPriceRecordService;
@@ -165,6 +168,12 @@ public class GoodsServiceImpl implements GoodsService {
         GoodsEntity entity = goodsDao.queryObjectByProdBarcodeAndBizType(prodBarcode, storeId);
         return entity;
     }
+
+    @Override
+    public GoodsEntity queryObjectByProdBarcodeAndStoreId(String prodBarcode, Integer storeId) {
+        return goodsDao.queryObjectByProdBarcodeAndStoreId(prodBarcode, storeId);
+    }
+
     @Override
     public List<GoodsEntity> queryList(Map<String, Object> map) {
         return goodsDao.queryList(map);
@@ -902,7 +911,8 @@ public class GoodsServiceImpl implements GoodsService {
                 }
                  GoodsEntity goodsNew = goodsDao.queryObjectBySnNew(goodsDto.getGoodsSn());
                  if(goodsNew!=null){
-                     throw new RRException("该商品数据已存在,请勿重复导入:"+goodsNew.getGoodsSn());
+                     goodsDao.update(goodsNew);
+//                     throw new RRException("该商品数据已存在,请勿重复导入:"+goodsNew.getGoodsSn());
                  }
                 // 获取品牌唯一简码
                 checkBrand(goodsDto, goodsEntity);
@@ -2141,4 +2151,74 @@ public class GoodsServiceImpl implements GoodsService {
     public int updateStockNumberByProductCodeAndSku(GoodsEntity goodsEntity) {
         return goodsDao.updateStockNumberByProductCodeAndSku(goodsEntity);
     }
+
+    /**
+     * 出库单更新库存(扣减)
+     *
+     * @param outboundList 出库sku
+     */
+    @Override
+    public void updateStockNumberByOutbound(List<StockChangeRecordEntity> outboundList) {
+
+        List<MngChangeEntity> changeEntityList = outboundList.stream().map(entity -> {
+            MngChangeEntity mngChangeEntity = new MngChangeEntity();
+            SysUserEntity user = ShiroUtils.getUserEntity();
+            Date date = new Date();
+            Integer number = entity.getNumber();
+            GoodsEntity goodsEntity = queryByBarcode(entity.getSku());
+
+            mngChangeEntity.setChangeType(Dict.changeType.item_5.getItem());
+            mngChangeEntity.setGoodsId(goodsEntity.getId().intValue());
+            mngChangeEntity.setChangeNum(number);
+            mngChangeEntity.setOriginalNum(goodsEntity.getGoodsNumber());
+            mngChangeEntity.setValidNum(goodsEntity.getGoodsNumber() - number);
+            mngChangeEntity.setChangeReason(Dict.changeType.item_5.getItemName());
+            mngChangeEntity.setCreateTime(date);
+            mngChangeEntity.setModTime(date);
+            mngChangeEntity.setCreaterSn(user.getUsername());
+            mngChangeEntity.setModerSn(user.getUsername());
+            mngChangeEntity.setIsValid(0);
+            mngChangeEntity.setMerchSn(goodsEntity.getMerchSn());
+            mngChangeEntity.setThirdPartyMerchCode(goodsEntity.getThirdPartyMerchCode());
+
+            return mngChangeEntity;
+        }).collect(Collectors.toList());
+        mngChangeService.saveBatch(changeEntityList);
+        goodsDao.updateStockNumberByOutbound(outboundList);
+    }
+
+    /**
+     * 入库单更新库存(增加)
+     *
+     * @param storageList 入库sku
+     */
+    @Override
+    public void updateStockNumberByStorage(List<StockChangeRecordEntity> storageList) {
+
+        List<MngChangeEntity> changeEntityList = storageList.stream().map(entity -> {
+            MngChangeEntity mngChangeEntity = new MngChangeEntity();
+            SysUserEntity user = ShiroUtils.getUserEntity();
+            Date date = new Date();
+            Integer number = entity.getNumber();
+            GoodsEntity goodsEntity = queryByBarcode(entity.getSku());
+
+            mngChangeEntity.setChangeType(Dict.changeType.item_6.getItem());
+            mngChangeEntity.setGoodsId(goodsEntity.getId().intValue());
+            mngChangeEntity.setChangeNum(number);
+            mngChangeEntity.setOriginalNum(goodsEntity.getGoodsNumber());
+            mngChangeEntity.setValidNum(goodsEntity.getGoodsNumber() + number);
+            mngChangeEntity.setChangeReason(Dict.changeType.item_6.getItemName());
+            mngChangeEntity.setCreateTime(date);
+            mngChangeEntity.setModTime(date);
+            mngChangeEntity.setCreaterSn(user.getUsername());
+            mngChangeEntity.setModerSn(user.getUsername());
+            mngChangeEntity.setIsValid(0);
+            mngChangeEntity.setMerchSn(goodsEntity.getMerchSn());
+            mngChangeEntity.setThirdPartyMerchCode(goodsEntity.getThirdPartyMerchCode());
+
+            return mngChangeEntity;
+        }).collect(Collectors.toList());
+        mngChangeService.saveBatch(changeEntityList);
+        goodsDao.updateStockNumberByStorage(storageList);
+    }
 }

+ 5 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/MerchServiceImpl.java

@@ -69,4 +69,9 @@ public class MerchServiceImpl
     public int deleteBatch(Integer[] ids) {
         return merchDao.deleteBatch(ids);
     }
+
+    @Override
+    public MerchEntity queryByMerchSn(String merchSn) {
+        return merchDao.findByMerchSn(merchSn);
+    }
 }

+ 5 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/MkActivitiesPromotionServiceImpl.java

@@ -168,4 +168,9 @@ public class MkActivitiesPromotionServiceImpl implements MkActivitiesPromotionSe
     public List<MkActivitiesPromotionEntity> queryListByMkaIdAndStoreId(int mkaId, String storeId) {
         return mkActivitiesPromotionDao.queryListByMkaIdAndStoreId(mkaId, storeId);
     }
+
+    @Override
+    public void deleteBatchByMkaId(int mkaId) {
+        mkActivitiesPromotionDao.deleteBatchByMkaId(mkaId);
+    }
 }

+ 5 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/MngChangeServiceImpl.java

@@ -55,4 +55,9 @@ public class MngChangeServiceImpl implements MngChangeService {
     public int deleteBatch(Integer[]ids) {
         return mngChangeDao.deleteBatch(ids);
     }
+
+    @Override
+    public void saveBatch(List<MngChangeEntity> changeEntityList) {
+        mngChangeDao.saveBatch(changeEntityList);
+    }
 }

+ 225 - 58
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -324,6 +324,9 @@ public class OrderServiceImpl implements OrderService {
     @Autowired
     private HaiKongSendOrderInfoDetailRecordService haiKongSendOrderInfoDetailRecordService;
 
+    @Autowired
+    private StockChangeRecordService stockChangeRecordService;
+
     @Override
     public OrderEntity queryObject(Long id) {
         return orderDao.queryObject(id);
@@ -2135,7 +2138,7 @@ public class OrderServiceImpl implements OrderService {
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public synchronized Map offlineRetailSubmit(Map param, SysUserEntity user) {
+    public Map offlineRetailSubmit(Map param, SysUserEntity user) {
         long start = System.currentTimeMillis();
         // 解析订单数据 List
         List<LinkedHashMap> goodsList = (List<LinkedHashMap>) param.get("goodsList");
@@ -2173,17 +2176,23 @@ public class OrderServiceImpl implements OrderService {
             LOGGER.error("decode machine code failed! error message : ", e);
         }
         Integer storeId = user.getStoreId();
+        if(Objects.isNull(storeId)){
+            throw new ServiceException(String.format("登录用户错误,请刷新后确认!"));
+        }
         // 根据商品条码、sku、门店id查询相对应的商品信息,并组装成对象
         List<QueryGoodsVO> queryGoodsVOList = new ArrayList<>();
         Map<String, GoodsEntity> goodsEntityMap;
         List<GoodsEntity> goodsEntityList;
+
+        List<StockChangeRecordEntity> stockChangeRecordEntities = new ArrayList<>();
         try {
             goodsList.forEach(map -> {
                 QueryGoodsVO queryGoodsVo = new QueryGoodsVO();
                 queryGoodsVo.setProdBarcode((String) map.get("prodBarcode"));
                 queryGoodsVo.setSku((String) map.get("goodsSn"));
                 queryGoodsVo.setStoreId(storeId.longValue());
-                queryGoodsVo.setSellVolume((Integer) map.get("sellVolume"));
+                Integer sellVolume = (Integer) map.get("sellVolume");
+                queryGoodsVo.setSellVolume(sellVolume);
                 queryGoodsVo.setRetailPrice(new BigDecimal(String.valueOf(map.get("retailPrice"))));
                 queryGoodsVo.setGoodsTaxes(new BigDecimal(String.valueOf(map.get("goodstaxes"))));
                 Object discountedPriceObj = map.get("discountedPrice");
@@ -2206,6 +2215,17 @@ public class OrderServiceImpl implements OrderService {
                     deductionPrice = new BigDecimal(deductionPriceObj.toString());
                 }
                 queryGoodsVo.setDeductionPrice(deductionPrice);
+
+                StockChangeRecordEntity stockChangeRecordEntity = new StockChangeRecordEntity();
+                stockChangeRecordEntity.setNumber(sellVolume);
+                stockChangeRecordEntity.setMerchSn(user.getMerchSn());
+                stockChangeRecordEntity.setThirdMerchSn(user.getThirdPartyMerchCode());
+                stockChangeRecordEntity.setRemark("销售出库");
+                stockChangeRecordEntity.setSku(queryGoodsVo.getProdBarcode());
+                stockChangeRecordEntity.setStoreId(storeId);
+                stockChangeRecordEntity.setType(Constants.StockChangeType.item_2.getType());
+                stockChangeRecordEntities.add(stockChangeRecordEntity);
+
                 queryGoodsVOList.add(queryGoodsVo);
             });
             // 将在循环中查询数据库改为一次性查询
@@ -2216,6 +2236,8 @@ public class OrderServiceImpl implements OrderService {
             throw new ServiceException(e);
         }
 
+
+
         Map resultObj = Maps.newHashMap();
         // 海控需求,下单流程修改,收银端接收会员码,付款码,用户信息,订单数据
         // 1. 校验库存:保税仓库存 + 展销店库存 - 出区数 >= 购买数
@@ -2310,10 +2332,9 @@ public class OrderServiceImpl implements OrderService {
             listUtils.copyList(goodsEntityList, queryGoodsVOList);
 
             //生成商户订单号
-            SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
-//            String orderSn = "ZMHK" + format.format(new Date()) + CommonUtil.generateOrderNumber();
             Snowflake snowflake = IdUtil.createSnowflake(14, 14);
             String orderSn = "8" + snowflake.nextIdStr().substring(6);
+            LOGGER.info("订单======>{},请求生成订单数据======>{}", orderSn, JacksonUtil.toJson(param));
             // 检查库存和更新库存
             for (QueryGoodsVO goodsDto : queryGoodsVOList) {
                 // 要购买的数量
@@ -2337,8 +2358,7 @@ public class OrderServiceImpl implements OrderService {
                         LOGGER.error("sku:【{}】库存不足,门店可用库存:【{}】,仓库可用库存:【{}】,购买数量:【{}】", sku, stockNum, warehouseStock, sellVolume);
                         throw new ServiceException(String.format("sku:【%s】库存不足,门店可用库存:【%s】,仓库可用库存:【%s】,购买数量:【%s】", sku, stockNum, warehouseStock, sellVolume));
                     }
-                    sellVolume -= 1;
-                    // TODO 库存变化记录新增字段:订单号、门店编号
+                    // 库存变化记录新增字段:订单号、门店编号
                     // 门店库存变化记录
                     StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
                     storeMngChangeEntity.setChangeType(Dict.changeType.item_1.getItem());
@@ -2409,6 +2429,7 @@ public class OrderServiceImpl implements OrderService {
                     goodsEntity.setActivity(goodsDto.getActivity());
                     goodsEntity.setStoreId(storeId);
                     goodsEntity.setListPicUrl(goodsDto.getListPicUrl());
+                    // wcq-注解: goodsEntity1 库存信息  goodsEntity 此次购买的商品信息附加一些库存属性值
                     GoodsEntity goodsEntity1 = goodsEntityMap.get(sku);
                     if (Objects.nonNull(goodsEntity1)) {
                         goodsEntity.setWarehouseSn(goodsEntity1.getWarehouseSn());
@@ -2464,6 +2485,19 @@ public class OrderServiceImpl implements OrderService {
                 userEntity.setOpenId(userEntity.getMobile());
                 userEntity.setMemberCode(memberCode);
                 userDao.update(userEntity);
+
+                MerchUserEntity merchUserEntity = merchUserDao.queryObjectByStoreId(storeId.longValue(), userEntity.getId().longValue());
+
+                if (Objects.isNull(merchUserEntity)) {
+                    merchUserEntity = new MerchUserEntity();
+                    merchUserEntity.setMerchSn(user.getMerchSn());
+                    merchUserEntity.setStoreId(storeId);
+                    merchUserEntity.setUserId(userEntity.getId());
+                    merchUserEntity.setCreateTime(new Date());
+                    merchUserEntity.setIsLoadGoods("0");
+                    merchUserDao.save(merchUserEntity);
+                }
+
             }
 
             // 判断该用户是否是生日
@@ -2513,6 +2547,12 @@ public class OrderServiceImpl implements OrderService {
             // 批量保存订单详情
             orderGoodsService.saveBatchOrderDetail(orderGoodsVoList);
 
+            stockChangeRecordEntities.forEach(stockChangeRecordEntity -> {
+                stockChangeRecordEntity.setOrderSn(orderSn);
+            });
+
+            stockChangeRecordService.saveBatchByOrderSubmit(stockChangeRecordEntities);
+
             //清空预订单商品临时表
             Map orderInfoMap = Maps.newHashMap();
             orderInfoMap.put("orderInfo", order);
@@ -2533,13 +2573,12 @@ public class OrderServiceImpl implements OrderService {
             if (!org.springframework.util.StringUtils.isEmpty(env) && Constants.PROD.equals(env)) {
                 if (parCode.startsWith("28")) {
                     // 支付宝支付
-                    throw new ServiceException("目前暂不支持支付宝付款!请使用微信进行支付!");
-                    /*try {
+                    try {
                         AliPay(user, parCode, order, processRecordEntity, orderWXPayRecordCurrent, store);
                     } catch (Exception e) {
                         LOGGER.error("支付宝支付出现异常!订单号:【{}】", order.getOrder_sn(), e);
                         throw e;
-                    }*/
+                    }
                 } else {
                     // 微信支付
                     try {
@@ -2620,9 +2659,10 @@ public class OrderServiceImpl implements OrderService {
                             orderGiftScoreRulesVo.setGenerateType(Constants.MemberScoreRulesEnum.TWO.getCode());
                             if (ratio.compareTo(BigDecimal.ZERO) > 0) {
                                 // 算出所积的分
-                                int giftScore = money.multiply(ratio).setScale(0, BigDecimal.ROUND_FLOOR).add(new BigDecimal(memberScore.get())).intValue();
+                                BigDecimal bigDecimal = money.multiply(ratio).setScale(0, BigDecimal.ROUND_FLOOR);
+                                int giftScore = bigDecimal.add(new BigDecimal(memberScore.get())).intValue();
                                 memberScore.set(giftScore);
-                                orderGiftScoreRulesVo.setGiftScore(giftScore);
+                                orderGiftScoreRulesVo.setGiftScore(bigDecimal.intValue());
                                 orderGiftScoreRulesVo.setGenerateRatio(ratio);
                             } else {
                                 // 积分比例设置为0,该商品不记积分。
@@ -2650,9 +2690,10 @@ public class OrderServiceImpl implements OrderService {
                                     BigDecimal money = goodsMap.get(sku);
                                     if (ratio.compareTo(BigDecimal.ZERO) > 0) {
                                         // 算出所积的分
-                                        int giftScore = money.multiply(ratio).setScale(0, BigDecimal.ROUND_FLOOR).add(new BigDecimal(memberScore.get())).intValue();
+                                        BigDecimal bigDecimal = money.multiply(ratio).setScale(0, BigDecimal.ROUND_FLOOR);
+                                        int giftScore = bigDecimal.add(new BigDecimal(memberScore.get())).intValue();
                                         memberScore.set(giftScore);
-                                        orderGiftScoreRulesVo.setGiftScore(giftScore);
+                                        orderGiftScoreRulesVo.setGiftScore(bigDecimal.intValue());
                                         orderGiftScoreRulesVo.setGenerateRatio(ratio);
                                     } else {
                                         // 积分比例设置为0,该商品不记积分。
@@ -2679,9 +2720,10 @@ public class OrderServiceImpl implements OrderService {
                                 BigDecimal money = goodsMap.get(sku);
                                 if (ratio.compareTo(BigDecimal.ZERO) != 0) {
                                     // 算出所积的分
-                                    int giftScore = money.multiply(ratio).setScale(0, BigDecimal.ROUND_FLOOR).add(new BigDecimal(memberScore.get())).intValue();
+                                    BigDecimal bigDecimal = money.multiply(ratio).setScale(0, BigDecimal.ROUND_FLOOR);
+                                    int giftScore = bigDecimal.add(new BigDecimal(memberScore.get())).intValue();
                                     memberScore.set(giftScore);
-                                    orderGiftScoreRulesVo.setGiftScore(giftScore);
+                                    orderGiftScoreRulesVo.setGiftScore(bigDecimal.intValue());
                                     orderGiftScoreRulesVo.setGenerateRatio(ratio);
                                 } else {
                                     // 积分比例设置为0,该商品不记积分。
@@ -2755,10 +2797,14 @@ public class OrderServiceImpl implements OrderService {
             if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
                 // 同步会员订单消费记录
                 syncMemberConsumeRecord(memberPhone, order, deductionScore);
-                syncMemberScoreChangeRecord(openId, order, deductionScore, "下单扣减", queryGoodsVOList, giftGoodsScoreDetailMap, HaiKongMemberScoreChangeEventEnum.SUBTRACT.getEvent());
-                // 积分变动接口,下单扣减
+                if (deductionScore > 0) {
+                    // 积分变动接口,下单扣减
+                    syncMemberScoreChangeRecord(openId, order, deductionScore, "下单扣减", queryGoodsVOList, giftGoodsScoreDetailMap, HaiKongMemberScoreChangeEventEnum.SUBTRACT.getEvent());
+                }
                 Integer score = memberScore.get();
-                syncMemberScoreChangeRecord(openId, order, score, "下单赠送", queryGoodsVOList, giftGoodsScoreDetailMap, HaiKongMemberScoreChangeEventEnum.ADD.getEvent());
+                if (score > 0) {
+                    syncMemberScoreChangeRecord(openId, order, score, "下单赠送", queryGoodsVOList, giftGoodsScoreDetailMap, HaiKongMemberScoreChangeEventEnum.ADD.getEvent());
+                }
             }
 
             // 生成取票码
@@ -2780,7 +2826,7 @@ public class OrderServiceImpl implements OrderService {
             JedisUtil.del(Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + storeId);
 
 
-            if (org.springframework.util.StringUtils.isEmpty(env) && Constants.TEST.equals(env)) {
+            if (!org.springframework.util.StringUtils.isEmpty(env) && Constants.TEST.equals(env)) {
                 order.setPayApp("wxpay");
                 order.setRequest("1111111111111111111");
                 order.setResponse("2222222222222222222");
@@ -2794,7 +2840,7 @@ public class OrderServiceImpl implements OrderService {
             LOGGER.info("----------------------------------------------------------------------------");
             return resultObj;
         } catch (Exception e) {
-            LOGGER.error("下单出现异常:" + e);
+            LOGGER.error("下单出现异常:",e);
             resultObj.put("errno", 400);
             resultObj.put("errmsg", "订单异常------" + e.getMessage());
             throw new RuntimeException(e);
@@ -2840,6 +2886,10 @@ public class OrderServiceImpl implements OrderService {
             } else if (Objects.nonNull(r) && ErrorCodeConstants.VmcShopSysErrorCodeEnum.CODE_10500.getCode().equals(r.getCode())) {
                 pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_6.getStatus());
                 haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
+                Map<String, Object> map = new HashMap<>();
+                map.put("orderSn", orderSn);
+                map.put("clearMsg", response);
+                orderProcessRecordDao.updateMallOrderProcessRecord(map);
                 LOGGER.error("推送订单到免税mall失败!响应结果:{}", response);
             } else if (Objects.isNull(r)) {
                 pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_6.getStatus());
@@ -2883,6 +2933,7 @@ public class OrderServiceImpl implements OrderService {
         entity.setIdentityCard(seaportInfo.getIdentityCard());
         entity.setIdentityMobile(seaportInfo.getIdentityMobile());
         entity.setIdentityName(seaportInfo.getIdentityName());
+        entity.setOutTradeNo(sendOrderToVmcShopDTO.getPayInfo().getOutTradeNo());
         entity.setOrderProductInfo(JacksonUtil.toJson(seaportInfo.getOrderProductInfoList()));
 
         return entity;
@@ -2920,7 +2971,21 @@ public class OrderServiceImpl implements OrderService {
         String response = order.getResponse();
         response = response.replaceAll("\r|\n", "");
         payInfoDTO.setResponse(response);
-        payInfoDTO.setOutTradeNo(order.getAliTradeNo());
+        if ("wxpay".equals(order.getPayApp())) {
+            String payTransactionId = order.getPayTransactionId();
+            if (org.springframework.util.StringUtils.isEmpty(payTransactionId)) {
+                OrderEntity orderEntity = orderDao.queryObjectByOrderSn(order.getOrder_sn());
+                payTransactionId = orderEntity.getPayTransactionId();
+            }
+            payInfoDTO.setOutTradeNo(payTransactionId);
+        } else {
+            String aliTradeNo = order.getAliTradeNo();
+            if (org.springframework.util.StringUtils.isEmpty(aliTradeNo)) {
+                OrderEntity orderEntity = orderDao.queryObjectByOrderSn(order.getOrder_sn());
+                aliTradeNo = orderEntity.getAliTradeNo();
+            }
+            payInfoDTO.setOutTradeNo(aliTradeNo);
+        }
         return payInfoDTO;
     }
 
@@ -2940,8 +3005,9 @@ public class OrderServiceImpl implements OrderService {
         orderInfoItemDTO.setPrice(orderGoodsVo.getRetail_price());
         orderInfoItemDTO.setItemcode(orderGoodsVo.getSku());
         orderInfoItemDTO.setAmount(orderGoodsVo.getActualPaymentAmount());
-        orderInfoItemDTO.setBuyPrice(orderGoodsVo.getActualPaymentAmount());
-        orderInfoItemDTO.setNums(orderGoodsVo.getNumber());
+        Integer number = orderGoodsVo.getNumber();
+        orderInfoItemDTO.setBuyPrice(orderGoodsVo.getActualPaymentAmount().divide(BigDecimal.valueOf(number), 2, BigDecimal.ROUND_HALF_UP));
+        orderInfoItemDTO.setNums(number);
         orderInfoItemDTO.setTax("true");
         orderInfoItemDTO.setTaxPrice(orderGoodsVo.getTaxPrice());
         return orderInfoItemDTO;
@@ -3108,6 +3174,8 @@ public class OrderServiceImpl implements OrderService {
         orderSendCusParams.put("thirdPartyMerchName", store.getThirdPartyMerchName());
         orderSendCusParams.put("tradeNo", order.getAliTradeNo());
         orderSendCusParams.put("amount", order.getActual_price());
+        orderSendCusParams.put("buyerIdNo", order.getIdCard());
+        orderSendCusParams.put("buyerName", order.getPay_name());
 
         // 将支付单信息发送到当前项目下的 cuspay
         aliCusDeclareBiz.biz(orderSendCusParams);
@@ -3160,6 +3228,12 @@ public class OrderServiceImpl implements OrderService {
             orderDao.updateOrderInfo(orderRaram);
             this.confirmPay(order.getId(), Dict.payFlag.item_weixin.getItem(), orderWXPayRecordCurrent.getOutTradeNoWX());
 
+            sendWxPayInfo(order, store, wechatMicropayApiResult.getTransaction_id());
+            HaiKongSendOrderInfoRecordEntity haiKongSendOrderInfoRecordEntity = new HaiKongSendOrderInfoRecordEntity();
+            haiKongSendOrderInfoRecordEntity.setOuterOrderNo(order.getOrder_sn());
+            haiKongSendOrderInfoRecordEntity.setOutTradeNo(wechatMicropayApiResult.getTransaction_id());
+            haiKongSendOrderInfoRecordService.updateByOrderSn(haiKongSendOrderInfoRecordEntity);
+
             // 设置支付单完成时间
             processRecordEntity.setPaymentSuccTimeStr(wechatMicropayApiResult.getTime_end());
             processRecordEntity.setPaymentSuccTime(
@@ -3174,9 +3248,8 @@ public class OrderServiceImpl implements OrderService {
             int times = 0;
             // 查询是否支付了
             while (true) {
-                boolean flag = orderQuery(order, processRecordEntity);
+                boolean flag = orderQuery(order, processRecordEntity, store);
                 if (flag) {
-                    atomicBoolean.set(true);
                     break;
                 }
                 try {
@@ -3215,20 +3288,21 @@ public class OrderServiceImpl implements OrderService {
             throw new RuntimeException("未支付或支付失败,请联系管理员");
         }
 
-        if (atomicBoolean.get()) {
-            // 推送支付单
-            sendWxPayInfo(order, store, wechatMicropayApiResult);
-        }
-
     }
 
-    private void sendWxPayInfo(OrderVo order, StoreEntity store, WechatMicropayApiResult wechatMicropayApiResult) {
+    private void sendWxPayInfo(OrderVo order, StoreEntity store, String tradeNo) {
         // 组装支付单信息
         String payTransactionId = "";
-        if (Objects.nonNull(wechatMicropayApiResult)) {
-            payTransactionId = wechatMicropayApiResult.getTransaction_id();
+        if (!org.springframework.util.StringUtils.isEmpty(tradeNo)) {
+            payTransactionId = tradeNo;
         } else {
-            payTransactionId = order.getPayTransactionId();
+            if (!org.springframework.util.StringUtils.isEmpty(order.getPayTransactionId())) {
+                payTransactionId = order.getPayTransactionId();
+            } else {
+                OrderEntity orderEntity = orderDao.queryObjectByOrderSn(order.getOrder_sn());
+                payTransactionId = orderEntity.getPayTransactionId();
+            }
+
         }
 
         Map<String, Object> orderSendCusParams = new HashMap<>();
@@ -3241,7 +3315,8 @@ public class OrderServiceImpl implements OrderService {
         orderSendCusParams.put("transactionId", payTransactionId);
         orderSendCusParams.put("subOrderId", "");   // ccnet原逻辑没有对该字段赋值
         orderSendCusParams.put("subOrderNo", order.getOrder_sn());
-        orderSendCusParams.put("feeType", order.getFeeType());
+        orderSendCusParams.put("feeType", "CNY");
+        orderSendCusParams.put("duty", 0);
         int orderFee = order.getActual_price().multiply(new BigDecimal(100)).intValue();
         orderSendCusParams.put("orderFee", orderFee);
         orderSendCusParams.put("productFee", orderFee);
@@ -3268,11 +3343,32 @@ public class OrderServiceImpl implements OrderService {
         memberOrderInfoSyncDTO.setConsumeDate(new Date());
         memberOrderInfoSyncDTO.setOrderAmount(order.getActual_price());
         memberOrderInfoSyncDTO.setOrderScore(deductionScore);
+        HashMap<Object, Object> orderIdMap = new HashMap<>();
+        orderIdMap.put("orderId",order.getId().toString());
+        //新增传给海控会员系统添加商品明细
+        List<OrderGoodsEntity> orderGoodsEntities = orderGoodsDao.queryList(orderIdMap);
+        List list = new ArrayList<Map>();
+        for (OrderGoodsEntity orderGoodsEntity : orderGoodsEntities) {
+            HashMap<Object, Object> map = new HashMap<>();
+            map.put("item_no",orderGoodsEntity.getSku());//商品编码
+            map.put("item_name",orderGoodsEntity.getGoodsName());//名称
+            map.put("item_price",orderGoodsEntity.getActualPaymentAmount());//商品实际支付金额
+            //会员系统那边开发可不传这两个字段
+//            map.put("add_score");//商品基础积分
+//            map.put("active_score",);//商品活动积分
+            map.put("use_score",orderGoodsEntity.getDeductionScore());//商品使用积分抵扣
+            map.put("deduction_money",orderGoodsEntity.getDeductionPrice());//商品积分抵扣金额
+            map.put("item_num",orderGoodsEntity.getNumber());//商品数量
+            list.add(map);
+        }
+        memberOrderInfoSyncDTO.setItemInfoList(list);
+
         BeanUtils.copyProperties(memberOrderInfoSyncDTO, haiKongMemberOrderSyncResendEntity);
         Date date = new Date();
         haiKongMemberOrderSyncResendEntity.setCreateTime(date);
         haiKongMemberOrderSyncResendEntity.setLastResendTime(date);
         haiKongMemberOrderSyncResendEntity.setPhone(memberPhone);
+        haiKongMemberOrderSyncResendEntity.setOrderId(order.getId().toString());
         try {
             String body = JacksonUtil.toJson(memberOrderInfoSyncDTO);
             LOGGER.info("请求会员系统同步消费订单接口!请求体:{}", body);
@@ -3293,7 +3389,9 @@ public class OrderServiceImpl implements OrderService {
         } catch (Exception e) {
             LOGGER.error("请求会员系统同步消费订单接口出现异常!准备新增发送失败记录,等待重发!异常信息:", e);
             // 没有请求成功,写表,重发
-            haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
+            //lhm 重发状态是修改成无需重发应修改为等待重发供定时器去重发
+//            haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
+            haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
             haiKongMemberOrderSyncResendService.save(haiKongMemberOrderSyncResendEntity);
         }
     }
@@ -3375,7 +3473,7 @@ public class OrderServiceImpl implements OrderService {
         }
     }
 
-    private boolean orderQuery(OrderVo order, OrderProcessRecordEntity processRecordEntity) {
+    private boolean orderQuery(OrderVo order, OrderProcessRecordEntity processRecordEntity, StoreEntity store) {
         LOGGER.info(">>>>>>>>>>>>>>>>>>>>wxOrderQuery 微信查询接口调用");
         String merchOrderSn = order.getMerchOrderSn();
         String orderId = order.getId() + "";
@@ -3397,8 +3495,19 @@ public class OrderServiceImpl implements OrderService {
                     Map processParam = Maps.newHashMap();
                     processParam.put("payTime", successTime);
                     processParam.put("orderSn", orderSn);
+                    order.setPayTransactionId(result.getTransaction_id());
                     orderDao.updateOrderProcessRecord(processParam);
 
+
+
+                    sendWxPayInfo(order, store, result.getTransaction_id());
+                    HaiKongSendOrderInfoRecordEntity haiKongSendOrderInfoRecordEntity = new HaiKongSendOrderInfoRecordEntity();
+                    haiKongSendOrderInfoRecordEntity.setOutTradeNo(result.getTransaction_id());
+                    haiKongSendOrderInfoRecordEntity.setResponse(JacksonUtil.toJson(result));
+                    haiKongSendOrderInfoRecordEntity.setOuterOrderNo(order.getOrder_sn());
+
+                    haiKongSendOrderInfoRecordService.updateByOrderSn(haiKongSendOrderInfoRecordEntity);
+
 //                    orderWXPayRecordService
 //                                    .updateWXPayRecordTradeState(orderWXPayRecordTemp.getId(), wechatRefundApiResult);
 
@@ -3639,6 +3748,8 @@ public class OrderServiceImpl implements OrderService {
         //调用会员系统积分全量回退接口
         vipIntegralGoBack(order);
 
+        //调用会员退货单推送-整单退货接口
+
     }
 
     /**
@@ -4263,6 +4374,7 @@ public class OrderServiceImpl implements OrderService {
      */
     @Override
     public CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPrice(CalculateOrderDiscountPriceVO calculateOrderDiscountPriceVo) {
+        LOGGER.debug("计算活动优惠价格,请求参数为{}",calculateOrderDiscountPriceVo);
         if (Objects.isNull(calculateOrderDiscountPriceVo)) {
             LOGGER.error("计算活动优惠价格,请求参数为null!");
             throw new ServiceException("计算活动优惠价格,请求参数为null!");
@@ -4278,22 +4390,22 @@ public class OrderServiceImpl implements OrderService {
             // 清空上一次计算活动价格的相关信息
             BigDecimal deductionPrice = good.getDeductionPrice();
             if (Objects.nonNull(deductionPrice)) {
-                good.setDeductionPrice(null);
+                good.setDeductionPrice(BigDecimal.ZERO);
             }
             Integer deductionScore = good.getDeductionScore();
             if (Objects.nonNull(deductionScore)) {
-                good.setDeductionScore(null);
+                good.setDeductionScore(0);
             }
             BigDecimal discountedPrice = good.getDiscountedPrice();
             if (Objects.nonNull(discountedPrice)) {
-                good.setDiscountedPrice(null);
+                good.setDiscountedPrice(BigDecimal.ZERO);
             }
             String activity = good.getActivity();
             if (Objects.nonNull(activity)) {
                 good.setActivity(null);
             }
             BigDecimal actualPaymentAmount = good.getActualPaymentAmount().multiply(BigDecimal.valueOf(good.getSellVolume()));
-            good.setActualPaymentAmount(good.getRetailPrice());
+            good.setActualPaymentAmount(good.getRetailPrice().multiply(BigDecimal.valueOf(good.getSellVolume())));
 
             QueryGoodsVO queryGoodsVo = new QueryGoodsVO();
             BeanUtils.copyProperties(good, queryGoodsVo);
@@ -4399,10 +4511,11 @@ public class OrderServiceImpl implements OrderService {
                         if (entityBarcode.equals(prodBarcode) && entityGoodsSn.equals(sku) && shopSn.equals(storeId)) {
                             GoodsEntity goodsEntity = goodsMap.get(sku);
                             BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, activityPrice, goodsService).setScale(3, RoundingMode.HALF_UP);
-                            goodsDetailsDto.setActualPaymentAmount(activityPrice);
+                            goodsDetailsDto.setActualPaymentAmount(activityPrice.multiply(new BigDecimal(goodsDetailsDto.getSellVolume())));
                             goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
                             goodsDetailsDto.setActivity(Constants.ActivityTopicEnum.LSCX.getTopicName());
-                            goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(activityPrice));
+                            // 优惠价格 应该用优惠后的特价价格 乘以 数量
+                            goodsDetailsDto.setDiscountedPrice((retailPrice.subtract(activityPrice)).multiply(new BigDecimal(goodsDetailsDto.getSellVolume())));
                             goodsDetailsDto.setDeductionPrice(null);
                             activityFlag.set(false);
                             promotionActivityFlag.set(true);
@@ -4619,7 +4732,10 @@ public class OrderServiceImpl implements OrderService {
             queryGoodsVo.setStoreId(Long.parseLong(storeId));
             queryGoodsVo.setDisCountedPrice(BigDecimal.ZERO);
             queryGoodsVo.setTotalPrice(good.getActualPaymentAmount().multiply(BigDecimal.valueOf(good.getSellVolume())));
-            orderTotalPrice = orderTotalPrice.add(good.getActualPaymentAmount().multiply(BigDecimal.valueOf(good.getSellVolume())));
+            orderTotalPrice = orderTotalPrice.add(good.getRetailPrice().multiply(BigDecimal.valueOf(good.getSellVolume())));// 订单总金额 改为用零售价*数量
+            // 订单总价 总价减去 优惠活动的优惠价格 后续积分优惠 也从总金额中减去(打补丁操作
+            // 这块设计有问题 :后续积分优惠金额  由总金额减去积分抵扣金额 但没有处理其他活动的优惠金额  补丁内容:如果这里有参加其他活动的商品 优惠金额要在这里减去)
+            orderTotalPrice = orderTotalPrice.subtract(good.getDiscountedPrice());
             goodsVos.add(queryGoodsVo);
         }
         calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
@@ -4628,6 +4744,8 @@ public class OrderServiceImpl implements OrderService {
         calculateOrderDiscountPriceResponseVO.setMemberCurrentAvailableScore(0);
         calculateOrderDiscountPriceResponseVO.setDeductionScore(0);
 
+        // 根据收银端开关选择是否适用积分抵扣。
+        boolean useScore = Objects.isNull(calculateOrderDiscountPriceVo.getUseScore()) || calculateOrderDiscountPriceVo.getUseScore();
         // 计算完活动优惠后,计算积分抵扣。(活动与积分抵扣不互斥)
         if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
             String memberInfoByCodeResponseJson;
@@ -4677,6 +4795,10 @@ public class OrderServiceImpl implements OrderService {
                     userService.update(userEntity);
                 }
                 Integer score = memberInfoDTO.getScore();
+                // 是否适用积分抵扣
+                if (!useScore) {
+                    return calculateOrderDiscountPriceResponseVO;
+                }
                 if (Objects.nonNull(score) && score > 0) {
                     // 有积分
                     afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, memberCode, openId, calculateOrderDiscountPriceResponseVO, goodsDetailsDtos, promotionSkuList, mkActivitiesEntityList);
@@ -4775,8 +4897,12 @@ public class OrderServiceImpl implements OrderService {
             if (!promotionSkuList.contains(sku)) {
                 if (!CollectionUtils.isEmpty(scoreDeductionAllowSkuList) && CollectionUtils.isEmpty(scoreDeductionRejectSkuList)) {
                     if (scoreDeductionAllowSkuList.contains(sku)) {
-                        BigDecimal skuActualPaymentAmount = goodsDetailsDto.getActualPaymentAmount()
-                                .multiply(BigDecimal.valueOf(goodsDetailsDto.getSellVolume()));
+                        BigDecimal skuActualPaymentAmount = goodsDetailsDto.getActualPaymentAmount();
+                        skuTotalPrice = skuTotalPrice.add(skuActualPaymentAmount);
+                    }
+                } else if (CollectionUtils.isEmpty(scoreDeductionAllowSkuList) && !CollectionUtils.isEmpty(scoreDeductionRejectSkuList)) {
+                    if (!scoreDeductionRejectSkuList.contains(sku)) {
+                        BigDecimal skuActualPaymentAmount = goodsDetailsDto.getActualPaymentAmount();
                         skuTotalPrice = skuTotalPrice.add(skuActualPaymentAmount);
                     }
                 }
@@ -4850,8 +4976,7 @@ public class OrderServiceImpl implements OrderService {
                     String sku = goodsDetailsDto.getGoodsSn();
                     String prodBarcode = goodsDetailsDto.getProdBarcode();
                     // 此字段 = 零售价 - 其他活动优惠金额
-                    BigDecimal actualPaymentAmount = goodsDetailsDto.getActualPaymentAmount()
-                            .multiply(BigDecimal.valueOf(goodsDetailsDto.getSellVolume()));
+                    BigDecimal actualPaymentAmount = goodsDetailsDto.getActualPaymentAmount();// 商品金额
                     // 当前商品最大支持抵扣的金额
                     BigDecimal currentSkuMaxDeductionPrice = actualPaymentAmount.multiply(scoreRatio).setScale(0, BigDecimal.ROUND_FLOOR);
                     // 其他活动优惠金额
@@ -4863,6 +4988,7 @@ public class OrderServiceImpl implements OrderService {
                     BigDecimal discountedPrice = BigDecimal.ZERO;
                     // 计算抵扣,当商品不是最后一个商品
                     if (i < index) {
+
                         shareScoreItem = actualPaymentAmount.multiply(scoreIntegerDecimal).divide(skuTotalPrice, 0, BigDecimal.ROUND_FLOOR);
                         discountedPrice = shareScoreItem.divide(BigDecimal.valueOf(scoreLimit), 2, BigDecimal.ROUND_HALF_UP);
                     }
@@ -5071,25 +5197,31 @@ public class OrderServiceImpl implements OrderService {
 
         BigDecimal goodsTotalPrice = BigDecimal.ZERO;
         BigDecimal fullCutCouponDec = Constant.ZERO;  // 非现金抵扣 = 各种优惠价格 +优惠券的价格   暂时借用这个字段去,为了不改动ccnet系统
+        BigDecimal deductionPrice = Constant.ZERO;// 积分抵扣金额
         BigDecimal couponPrice = BigDecimal.ZERO;
         BigDecimal freightPrice = Constant.ZERO;
         Integer number = 0;
         //订单价格计算:订单的总价+运费
         for (GoodsEntity goodsEntity : goodsList) {
+            // 商品总价 = 商品单价 * 购买数量  保留两位小数
             goodsTotalPrice = goodsTotalPrice
                     .add(goodsEntity.getRetailPrice().multiply(new BigDecimal(goodsEntity.getSellVolume()))).setScale(2, RoundingMode.HALF_UP);
+            // todo: 促销活动费用  这里取的是总优惠金额  不正确  但是后续把这个值传到订单的
             fullCutCouponDec = fullCutCouponDec
                     .add(goodsEntity.getDiscountedPrice()).setScale(2, RoundingMode.HALF_UP);
-            couponPrice = couponPrice.add(goodsEntity.getDiscountedPrice()).setScale(2, RoundingMode.HALF_UP);
+            // todo: 优惠券优惠金额  这里取的是总优惠金额  不正确
+            // couponPrice = couponPrice.add(goodsEntity.getDiscountedPrice()).setScale(2, RoundingMode.HALF_UP);
+            // 计算总积分抵扣金额
+            deductionPrice = deductionPrice.add(goodsEntity.getDeductionPrice()).setScale(2, RoundingMode.HALF_UP);
             number += goodsEntity.getSellVolume();
         }
 
 
         BigDecimal orderTotalPrice = goodsTotalPrice.add(new BigDecimal(0));
-        fullCutCouponDec = fullCutCouponDec.add(couponPrice).setScale(2, RoundingMode.HALF_UP);
+        // fullCutCouponDec = fullCutCouponDec.add(couponPrice).setScale(2, RoundingMode.HALF_UP);
 
         // 加上税额
-        goodsTotalPrice = goodsTotalPrice.subtract(totalTax).setScale(2, RoundingMode.HALF_UP);
+        // goodsTotalPrice = goodsTotalPrice.subtract(totalTax).setScale(2, RoundingMode.HALF_UP);
 
 //        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
 //
@@ -5140,30 +5272,40 @@ public class OrderServiceImpl implements OrderService {
         orderInfo.setStore_id(storeId);
         orderInfo.setFreight_price(freightPrice.intValue());
 
-        orderInfo.setCoupon_id(Integer.parseInt(String.valueOf(0L)));
-        orderInfo.setCoupon_price(couponPrice);
+        orderInfo.setCoupon_id(Integer.parseInt(String.valueOf(0L)));//  优惠券id
+        orderInfo.setCoupon_price(couponPrice);// 优惠券金额
         orderInfo.setCoupon_name("无");
         orderInfo.setActivity_id(0L);
 
         //使用的促销费用
-        orderInfo.setFull_cut_price(fullCutCouponDec);
-        orderInfo.setCampMinusId(0);
+        orderInfo.setFull_cut_price(fullCutCouponDec); // 促销活动费用
+        orderInfo.setCampMinusId(0);// 促销活动id
         orderInfo.setCampName("");
 
         //留言
         orderInfo.setPostscript("无");
         orderInfo.setAdd_time(new Date());
+        // 商品总价
         orderInfo.setGoods_price(actualPrice.subtract(totalTax));
-        orderInfo.setOrder_price(actualPrice);
+        // 订单总价 这里的订单总价取的是 扣减完优惠的商品总价
+        // orderInfo.setOrder_price(actualPrice);
+        // 订单总价 根据前端显示 这里应该取未扣减优惠的商品总价
+        orderInfo.setOrder_price(orderTotalPrice);
         orderInfo.setActual_price(actualPrice); // 实际支付金额
+        // 订单类型 1 普通订单 2 团购订单
         orderInfo.setOrder_type("1");
+        // 订单状态  0订单创建成功等待付款, 100订单付款中,101订单已取消,
+        // 102订单已删除,201订单已付款,等待发货,300订单已发货,
+        // 301用户确认收货,401 没有发货,退款 402 已收货,退款退货,500订单已关闭;501 支付失败
         orderInfo.setOrder_status(0);
         orderInfo.setShipping_status(0);
         orderInfo.setPay_status(0);
         orderInfo.setShipping_id(0L);
+        // 配送费用
         orderInfo.setShipping_fee(Constant.ZERO);
         orderInfo.setIntegral(0);
-        orderInfo.setIntegral_money(Constant.ZERO);
+        // 积分抵扣金额
+        orderInfo.setIntegral_money(deductionPrice);
         orderInfo.setCreateTime(new Date());
         orderInfo.setModTime(new Date());
         orderInfo.setPayMobile(loginUser.getMobile());
@@ -5299,6 +5441,7 @@ public class OrderServiceImpl implements OrderService {
             return R.error("该订单所属商户不存在:"+orderEntity.getOrderSn());
         }
         // 组装支付单信息
+        UserEntity userEntity = userService.queryByMobile(orderEntity.getMobile());
         Map<String, Object> orderSendCusParams = new HashMap<>();
         if(Dict.payFlag.item_weixin.getItem().equals(orderEntity.getPayFlag())){
             orderSendCusParams.put("merchSn", orderEntity.getMerchSn());
@@ -5316,7 +5459,6 @@ public class OrderServiceImpl implements OrderService {
             orderSendCusParams.put("orderFee", orderFee);
             orderSendCusParams.put("productFee", orderFee);
             orderSendCusParams.put("transportFee", 0);
-            UserEntity userEntity = userService.queryByMobile(orderEntity.getMobile());
             orderSendCusParams.put("certId", userEntity.getIdNo());
             orderSendCusParams.put("name", orderEntity.getPayName());
 
@@ -5332,6 +5474,8 @@ public class OrderServiceImpl implements OrderService {
             //阿里支付流水号
             orderSendCusParams.put("tradeNo", orderEntity.getAliTradeNo());
             orderSendCusParams.put("amount", orderEntity.getActualPrice());
+            orderSendCusParams.put("buyerIdNo", userEntity.getIdNo());
+            orderSendCusParams.put("buyerName", orderEntity.getPayName());
 
             // 将支付单信息发送到当前项目下的 cuspay
             aliCusDeclareBiz.biz(orderSendCusParams);
@@ -5389,4 +5533,27 @@ public class OrderServiceImpl implements OrderService {
     public int queryOrderMainTotal() {
         return orderDao.queryOrderMainTotal();
     }
+
+    @Override
+    public R resendOrderInfoToVmcShop(String orderSn) {
+
+        HaiKongSendOrderInfoRecordEntity sendOrderInfoRecordEntity = haiKongSendOrderInfoRecordService.queryObjectByOrderSn(orderSn);
+
+        if (Objects.isNull(sendOrderInfoRecordEntity)) {
+            LOGGER.error(String.format("重新推送订单到免税mall,订单号【%s】对应发送记录不存在", orderSn));
+            return R.error(String.format("订单号【%s】对应发送记录不存在", orderSn));
+        }
+        // 直接修改状态
+        if (!HaiKongMemberOrderResendStatusEnum.RESEND_SUCCESS.getStatus().equals(sendOrderInfoRecordEntity.getResendStatus())) {
+            HaiKongSendOrderInfoRecordEntity sendOrderInfoRecordEntity1 = new HaiKongSendOrderInfoRecordEntity();
+            sendOrderInfoRecordEntity1.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
+            sendOrderInfoRecordEntity1.setOuterOrderNo(orderSn);
+            haiKongSendOrderInfoRecordService.updateByOrderSn(sendOrderInfoRecordEntity1);
+        } else {
+            return R.ok("已经推送到免税mall成功,无需重推!");
+        }
+
+
+        return R.ok("重推成功!");
+    }
 }

+ 80 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/ProductStoreRelaServiceImpl.java

@@ -6,10 +6,13 @@ import com.kmall.admin.dao.*;
 import com.kmall.admin.dao.mk.dist.MkDistSellAllocationDao;
 import com.kmall.admin.dto.StoreGoodsDto;
 import com.kmall.admin.entity.*;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
 import com.kmall.admin.entity.mk.dist.MkDistSellAllocationEntity;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.admin.service.BrandService;
+import com.kmall.admin.service.GoodsService;
 import com.kmall.admin.service.ProductStoreRelaService;
+import com.kmall.admin.service.StoreMngChangeService;
 import com.kmall.admin.service.kmall2eccs.KtoEccsService;
 import com.kmall.admin.utils.ShiroUtils;
 import com.kmall.api.util.StockUtil;
@@ -23,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * Service实现类
@@ -75,6 +79,12 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
     private GoodsBatchDao goodsBatchDao;
 
     @Autowired
+    private StoreMngChangeService storeMngChangeService;
+
+    @Autowired
+    private GoodsService goodsService;
+
+    @Autowired
     private KtoEccsService ktoEccsService;
 
     @Override
@@ -1166,4 +1176,74 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
     public void updateStockNumByStoreIdAndSku(ProductStoreRelaEntity productStoreRelaEntity) {
         productStoreRelaDao.updateStockNumByStoreIdAndSku(productStoreRelaEntity);
     }
+
+    /**
+     * 出库单更新库存(扣减)
+     *
+     * @param outboundList 出库sku
+     */
+    @Override
+    public void updateStockNumberByOutbound(List<StockChangeRecordEntity> outboundList) {
+        List<StoreMngChangeEntity> mngChangeEntityList = outboundList.stream().map(entity -> {
+            StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
+            String sku = entity.getSku();
+            Integer number = entity.getNumber();
+            Integer storeId = entity.getStoreId();
+            Date date = new Date();
+            SysUserEntity userEntity = ShiroUtils.getUserEntity();
+            GoodsEntity goodsEntity = goodsService.queryObjectByProdBarcodeAndStoreId(sku, storeId);
+            storeMngChangeEntity.setChangeReason("出库单");
+            storeMngChangeEntity.setChangeType(Dict.changeType.item_5.getItem());
+            storeMngChangeEntity.setStoreChangeNum(number);
+            storeMngChangeEntity.setGoodsId(goodsEntity.getId().intValue());
+            storeMngChangeEntity.setGoodsName(sku);
+            storeMngChangeEntity.setStoreId(storeId);
+            storeMngChangeEntity.setStoreOriginalNum(goodsEntity.getStockNum());
+            storeMngChangeEntity.setStoreName(goodsEntity.getStoreName());
+            storeMngChangeEntity.setStoreValidNum(goodsEntity.getStockNum() - number);
+            storeMngChangeEntity.setIsValid(0);
+            storeMngChangeEntity.setModTime(date);
+            storeMngChangeEntity.setCreateTime(date);
+            storeMngChangeEntity.setCreaterSn(userEntity.getUsername());
+            storeMngChangeEntity.setModerSn(userEntity.getUsername());
+            return storeMngChangeEntity;
+        }).collect(Collectors.toList());
+        storeMngChangeService.saveBatch(mngChangeEntityList);
+        productStoreRelaDao.updateStockNumberByOutbound(outboundList);
+    }
+
+    /**
+     * 入库单更新库存(增加)
+     *
+     * @param storageList 入库sku
+     */
+    @Override
+    public void updateStockNumberByStorage(List<StockChangeRecordEntity> storageList) {
+        List<StoreMngChangeEntity> mngChangeEntityList = storageList.stream().map(entity -> {
+            StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
+            String sku = entity.getSku();
+            Integer number = entity.getNumber();
+            Integer storeId = entity.getStoreId();
+            Date date = new Date();
+            SysUserEntity userEntity = ShiroUtils.getUserEntity();
+            GoodsEntity goodsEntity = goodsService.queryObjectByProdBarcodeAndStoreId(sku, storeId);
+            storeMngChangeEntity.setChangeReason("入库单");
+            storeMngChangeEntity.setChangeType(Dict.changeType.item_6.getItem());
+            storeMngChangeEntity.setStoreChangeNum(number);
+            storeMngChangeEntity.setGoodsId(goodsEntity.getId().intValue());
+            storeMngChangeEntity.setGoodsName(sku);
+            storeMngChangeEntity.setStoreId(storeId);
+            storeMngChangeEntity.setStoreOriginalNum(goodsEntity.getStockNum());
+            storeMngChangeEntity.setStoreName(goodsEntity.getStoreName());
+            storeMngChangeEntity.setStoreValidNum(goodsEntity.getStockNum() + number);
+            storeMngChangeEntity.setIsValid(0);
+            storeMngChangeEntity.setModTime(date);
+            storeMngChangeEntity.setCreateTime(date);
+            storeMngChangeEntity.setCreaterSn(userEntity.getUsername());
+            storeMngChangeEntity.setModerSn(userEntity.getUsername());
+            return storeMngChangeEntity;
+        }).collect(Collectors.toList());
+        storeMngChangeService.saveBatch(mngChangeEntityList);
+        productStoreRelaDao.updateStockNumberByStorage(storageList);
+    }
 }

+ 5 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/StoreMngChangeServiceImpl.java

@@ -55,4 +55,9 @@ public class StoreMngChangeServiceImpl implements StoreMngChangeService {
     public int deleteBatch(Integer[]ids) {
         return storeMngChangeDao.deleteBatch(ids);
     }
+
+    @Override
+    public void saveBatch(List<StoreMngChangeEntity> mngChangeEntityList) {
+        storeMngChangeDao.saveBatch(mngChangeEntityList);
+    }
 }

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/HaikongSendOrderInfoRecordServiceImpl.java

@@ -75,4 +75,14 @@ public class HaikongSendOrderInfoRecordServiceImpl implements HaiKongSendOrderIn
     public void updateResendStatusBatch(List<HaiKongSendOrderInfoRecordEntity> entities) {
         haikongSendOrderInfoRecordDao.updateResendStatusBatch(entities);
     }
+
+    @Override
+    public HaiKongSendOrderInfoRecordEntity queryObjectByOrderSn(String orderSn) {
+        return haikongSendOrderInfoRecordDao.queryObjectByOuterOrderNo(orderSn);
+    }
+
+    @Override
+    public void updateByOrderSn(HaiKongSendOrderInfoRecordEntity sendOrderInfoRecordEntity) {
+        haikongSendOrderInfoRecordDao.updateByOrderSn(sendOrderInfoRecordEntity);
+    }
 }

+ 186 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/StockChangeRecordServiceImpl.java

@@ -0,0 +1,186 @@
+package com.kmall.admin.service.impl.haikong;
+
+import com.google.common.collect.ImmutableBiMap;
+import com.kmall.admin.dao.haikong.StockChangeRecordDao;
+import com.kmall.admin.dto.StockChangeRecordDto;
+import com.kmall.admin.entity.GoodsEntity;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
+import com.kmall.admin.haikong.constant.Constants;
+import com.kmall.admin.service.GoodsService;
+import com.kmall.admin.service.ProductStoreRelaService;
+import com.kmall.admin.service.haikong.StockChangeRecordService;
+import com.kmall.common.constant.Dict;
+import com.kmall.common.utils.MapBeanUtil;
+import com.kmall.common.utils.R;
+import com.kmall.common.utils.RRException;
+import com.kmall.common.utils.ValidatorUtil;
+import org.springframework.aop.framework.AopContext;
+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.util.CollectionUtils;
+
+import java.util.*;
+
+
+/**
+ * 海控出入库单记录Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-27 16:21:47
+ */
+@Service("stockChangeRecordService")
+public class StockChangeRecordServiceImpl implements StockChangeRecordService {
+    @Autowired
+    private StockChangeRecordDao stockChangeRecordDao;
+
+    @Autowired
+    private GoodsService goodsService;
+
+    @Autowired
+    private ProductStoreRelaService productStoreRelaService;
+
+    @Override
+    public StockChangeRecordEntity queryObject(Integer id) {
+        return stockChangeRecordDao.queryObject(id);
+    }
+
+    @Override
+    public List<StockChangeRecordEntity> queryList(Map<String, Object> map) {
+        return stockChangeRecordDao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return stockChangeRecordDao.queryTotal(map);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public synchronized int save(StockChangeRecordEntity stockChangeRecord) {
+        Date modifyTime = new Date();
+        stockChangeRecord.setModifyTime(modifyTime);
+        stockChangeRecord.setCreateTime(modifyTime);
+
+//        List<StockChangeRecordEntity> storageList = Collections.singletonList(stockChangeRecord);
+//        if (Constants.StockChangeType.item_0.getType().equals(stockChangeRecord.getType())) {
+//            // 出库
+//            productStoreRelaService.updateStockNumberByOutbound(storageList);
+//            goodsService.updateStockNumberByOutbound(storageList);
+//        } else if (Constants.StockChangeType.item_1.getType().equals(stockChangeRecord.getType())) {
+//            // 入库
+//            productStoreRelaService.updateStockNumberByStorage(storageList);
+//            goodsService.updateStockNumberByStorage(storageList);
+//        }
+
+        return stockChangeRecordDao.save(stockChangeRecord);
+    }
+
+    @Override
+    public int update(StockChangeRecordEntity stockChangeRecord) {
+        stockChangeRecord.setModifyTime(new Date());
+        return stockChangeRecordDao.update(stockChangeRecord);
+    }
+
+    @Override
+    public int delete(Integer id) {
+        return stockChangeRecordDao.delete(id);
+    }
+
+    @Override
+    public int deleteBatch(Integer[]ids) {
+        return stockChangeRecordDao.deleteBatch(ids);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void uploadExcel(List<StockChangeRecordDto> stockChangeRecordDtos) {
+        if (!CollectionUtils.isEmpty(stockChangeRecordDtos)) {
+            List<StockChangeRecordEntity> stockChangeRecordEntities = new ArrayList<>();
+
+            stockChangeRecordDtos.forEach(stockChangeRecordDto -> {
+                Map<String, Object> valideDate = MapBeanUtil.fromObject(stockChangeRecordDto);
+                // 校验excel传入的数据
+                ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+                builder.put("storeId", "门店编号");
+                builder.put("merchSn", "商户编号");
+                builder.put("thirdMerchSn", "第三方商户编号");
+                builder.put("sku", "商品SKU");
+                builder.put("type", "出入库类型");
+                builder.put("number", "出入库数量");
+
+                R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
+                if (Integer.valueOf(r.get("code").toString()) != 0) {
+                    throw new RRException(r.get("msg").toString());
+                }
+
+                StockChangeRecordEntity stockChangeRecordEntity = new StockChangeRecordEntity();
+                BeanUtils.copyProperties(stockChangeRecordDto, stockChangeRecordEntity);
+                Date createTime = new Date();
+                stockChangeRecordEntity.setCreateTime(createTime);
+                stockChangeRecordEntity.setModifyTime(createTime);
+                stockChangeRecordEntities.add(stockChangeRecordEntity);
+            });
+
+            ((StockChangeRecordService) AopContext.currentProxy()).saveBatch(stockChangeRecordEntities);
+
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public synchronized void saveBatch(List<StockChangeRecordEntity> stockChangeRecordEntities) {
+
+//        Map<String, List<StockChangeRecordEntity>> stringListHashMap = new HashMap<>();
+//
+//        stockChangeRecordEntities.forEach(entity -> {
+//            String type = entity.getType();
+//            if (stringListHashMap.containsKey(type)) {
+//                List<StockChangeRecordEntity> entities = stringListHashMap.get(type);
+//                entities.add(entity);
+//                stringListHashMap.put(type, entities);
+//            } else {
+//                ArrayList<StockChangeRecordEntity> entities = new ArrayList<>();
+//                entities.add(entity);
+//                stringListHashMap.put(type, entities);
+//            }
+//        });
+
+//        // 出库和入库,需要修改库存
+//        // 出库集合,减库存
+//        List<StockChangeRecordEntity> outboundList = stringListHashMap.get(Constants.StockChangeType.item_0.getType());
+//        if (!CollectionUtils.isEmpty(outboundList)) {
+//            productStoreRelaService.updateStockNumberByOutbound(outboundList);
+//            goodsService.updateStockNumberByOutbound(outboundList);
+//        }
+//        // 入库集合,加库存
+//        List<StockChangeRecordEntity> storageList = stringListHashMap.get(Constants.StockChangeType.item_1.getType());
+//        if (!CollectionUtils.isEmpty(storageList)) {
+//            productStoreRelaService.updateStockNumberByStorage(storageList);
+//            goodsService.updateStockNumberByStorage(storageList);
+//        }
+
+        stockChangeRecordDao.saveBatch(stockChangeRecordEntities);
+    }
+
+    /**
+     * 订单提交时进行保存,不修改库存
+     *
+     */
+    @Override
+    public void saveBatchByOrderSubmit(List<StockChangeRecordEntity> stockChangeRecordEntities) {
+        stockChangeRecordDao.saveBatch(stockChangeRecordEntities);
+    }
+
+    @Override
+    public List<StockChangeRecordEntity> queryListByParentIds(List<String> stringList) {
+        return stockChangeRecordDao.queryListByParentIds(stringList);
+    }
+
+    @Override
+    public void deleteBatchByParentIds(String[] ids) {
+        stockChangeRecordDao.deleteBatchByParentIds(ids);
+    }
+}

+ 303 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/StockChangeServiceImpl.java

@@ -0,0 +1,303 @@
+package com.kmall.admin.service.impl.haikong;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.google.common.collect.ImmutableBiMap;
+import com.kmall.admin.dto.StockChangeDto;
+import com.kmall.admin.dto.StockChangeRecordDto;
+import com.kmall.admin.entity.MerchEntity;
+import com.kmall.admin.entity.StoreEntity;
+import com.kmall.admin.entity.ThirdMerchantBizEntity;
+import com.kmall.admin.entity.haikong.StockChangeRecordEntity;
+import com.kmall.admin.fromcomm.entity.SysUserEntity;
+import com.kmall.admin.haikong.constant.Constants;
+import com.kmall.admin.service.*;
+import com.kmall.admin.service.haikong.StockChangeRecordService;
+import com.kmall.admin.utils.ShiroUtils;
+import com.kmall.common.utils.MapBeanUtil;
+import com.kmall.common.utils.R;
+import com.kmall.common.utils.RRException;
+import com.kmall.common.utils.ValidatorUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.kmall.admin.dao.haikong.StockChangeDao;
+import com.kmall.admin.entity.haikong.StockChangeEntity;
+import com.kmall.admin.service.haikong.StockChangeService;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+/**
+ * Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-29 14:46:49
+ */
+@Service("stockChangeService")
+public class StockChangeServiceImpl implements StockChangeService {
+    @Autowired
+    private StockChangeDao stockChangeDao;
+
+    @Autowired
+    private StockChangeRecordService stockChangeRecordService;
+
+    @Autowired
+    private StoreService storeService;
+
+    @Autowired
+    private ProductStoreRelaService productStoreRelaService;
+
+    @Autowired
+    private GoodsService goodsService;
+
+    @Autowired
+    private ThirdMerchantBizService thirdMerchantBizService;
+
+    @Autowired
+    private MerchService merchService;
+
+
+
+    private static final Logger log = LoggerFactory.getLogger(StockChangeServiceImpl.class);
+
+    @Override
+    public StockChangeEntity queryObject(String id) {
+        return stockChangeDao.queryObject(id);
+    }
+
+    @Override
+    public List<StockChangeEntity> queryList(Map<String, Object> map) {
+        return stockChangeDao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return stockChangeDao.queryTotal(map);
+    }
+
+    @Override
+    public int save(StockChangeEntity stockChange) {
+        List<StockChangeEntity> stockChangeEntities = stockChangeDao.queryListByIds(stockChange.getId());
+        if (!stockChangeEntities.isEmpty()){
+            log.info("工单号已存在:{}",stockChange.getId());
+            throw new RRException("工单号已存在!");
+        }
+        MerchEntity merchEntity = merchService.queryByMerchSn(stockChange.getMerchSn());
+        if (Objects.isNull(merchEntity)){
+            log.info("商户名称查询不到:{}",stockChange.getMerchSn());
+            throw new RRException("商户编号不存在:"+stockChange.getMerchSn());
+        }
+
+        StoreEntity storeEntity = storeService.queryObject(stockChange.getStoreId());
+        if (Objects.isNull(storeEntity)){
+            log.info("门店名称查询不到:{}",stockChange.getStoreId());
+            throw new RRException("门店id不存在:"+stockChange.getStoreId());
+        }
+        ThirdMerchantBizEntity thirdMerchangByCode = thirdMerchantBizService.getThirdMerchangByCode(stockChange.getThirdMerchSn());
+        if (Objects.isNull(thirdMerchangByCode)){
+
+
+              throw new RRException("第三方商户代码不存在:"+stockChange.getThirdMerchSn());
+        }
+        //商户名称
+        stockChange.setMerch(merchEntity.getMerchName());
+        //门店名称
+        stockChange.setStore(storeEntity.getStoreName());
+        //第三方商户名称
+        stockChange.setThirdMerch(thirdMerchangByCode.getThirdPartyMerchName());
+        SysUserEntity userEntity = ShiroUtils.getUserEntity();
+        stockChange.setCreateBy(userEntity.getUsername());
+        stockChange.setCreateTime(new Date());
+        return stockChangeDao.save(stockChange);
+    }
+
+    @Override
+    public int update(StockChangeEntity stockChange) {
+        return stockChangeDao.update(stockChange);
+    }
+
+    @Override
+    public int delete(String id) {
+        String[] ids = {id};
+        stockChangeRecordService.deleteBatchByParentIds(ids);
+        return stockChangeDao.delete(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int deleteBatch(String[]ids) {
+        stockChangeRecordService.deleteBatchByParentIds(ids);
+        return stockChangeDao.deleteBatch(ids);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void uploadExcel(List<StockChangeRecordDto> stockChangeRecordDtos, StockChangeDto stockChangeDto) {
+        if (!CollectionUtils.isEmpty(stockChangeRecordDtos) && Objects.nonNull(stockChangeDto)) {
+            List<StockChangeRecordEntity> stockChangeRecordEntities = new ArrayList<>();
+
+            String id = stockChangeDto.getId();
+            String merchSn = stockChangeDto.getMerchSn();
+            String thirdMerchSn = stockChangeDto.getThirdMerchSn();
+            Integer storeId = stockChangeDto.getStoreId();
+            StoreEntity storeEntity = storeService.queryObject(storeId);
+            String type = stockChangeDto.getType();
+            List<StockChangeEntity> stockChangeEntities = stockChangeDao.queryListByIds(id);
+            if (!stockChangeEntities.isEmpty()){
+                log.info("工单号已存在:{}",id);
+                throw new RRException("工单号已存在!");
+            }
+            if (StringUtils.isEmpty(id)) {
+                log.error("导入出入库单时,出入库单单号为空!");
+                throw new RRException("出入库单单号不能为空!");
+            }
+            if (StringUtils.isEmpty(merchSn)) {
+                log.error("导入出入库单时,商户编号为空!");
+                throw new RRException("商户编号不能为空!");
+            }
+            if (StringUtils.isEmpty(thirdMerchSn)) {
+                log.error("导入出入库单时,第三方商户编号为空!");
+                throw new RRException("第三方商户编号不能为空!");
+            }
+            if (Objects.isNull(storeId)) {
+                log.error("导入出入库单时,门店编号为空!");
+                throw new RRException("门店编号不能为空!");
+            }
+            if (Objects.isNull(storeEntity)) {
+                log.error("门店id对应门店不存在!");
+                throw new RRException(String.format("门店编号【%s】对应门店不存在!", storeId));
+            }
+            if (StringUtils.isEmpty(type)) {
+                log.error("导入出入库单时,类型为空!");
+                throw new RRException("类型不能为空!");
+            }
+            Date createTime = new Date();
+            stockChangeRecordDtos.forEach(stockChangeRecordDto -> {
+                Map<String, Object> valideDate = MapBeanUtil.fromObject(stockChangeRecordDto);
+                // 校验excel传入的数据
+                ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+                builder.put("sku", "商品SKU");
+                builder.put("number", "出入库数量");
+
+                R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
+                if (Integer.valueOf(r.get("code").toString()) != 0) {
+                    throw new RRException(r.get("msg").toString());
+                }
+
+                StockChangeRecordEntity stockChangeRecordEntity = new StockChangeRecordEntity();
+                BeanUtils.copyProperties(stockChangeRecordDto, stockChangeRecordEntity);
+
+                stockChangeRecordEntity.setCreateTime(createTime);
+                stockChangeRecordEntity.setModifyTime(createTime);
+                stockChangeRecordEntity.setThirdMerchSn(thirdMerchSn);
+                stockChangeRecordEntity.setMerchSn(merchSn);
+                stockChangeRecordEntity.setType(type);
+                stockChangeRecordEntity.setStoreId(storeId);
+                stockChangeRecordEntity.setParentId(id);
+                stockChangeRecordEntities.add(stockChangeRecordEntity);
+            });
+
+            // 先不修改库存,等审核成功后再进行修改
+            stockChangeRecordService.saveBatchByOrderSubmit(stockChangeRecordEntities);
+            SysUserEntity userEntity = ShiroUtils.getUserEntity();
+
+            StockChangeEntity stockChangeEntity = new StockChangeEntity();
+            BeanUtils.copyProperties(stockChangeDto, stockChangeEntity);
+            DateTime parse = DateUtil.parse(stockChangeDto.getTime(), "yyyy-MM-dd HH:mm:ss");
+            stockChangeEntity.setTime(parse);
+            stockChangeEntity.setAudit(Constants.AuditStatus.WAIT_AUDIT.getType());
+            stockChangeEntity.setStore(storeEntity.getStoreName());
+            stockChangeEntity.setMerch(storeEntity.getMerchName());
+            stockChangeEntity.setThirdMerch(stockChangeEntity.getThirdMerch());
+            stockChangeEntity.setCreateBy(userEntity.getUsername());
+            stockChangeEntity.setCreateTime(createTime);
+            stockChangeEntity.setModifyBy(userEntity.getUsername());
+            stockChangeEntity.setModifyTime(createTime);
+
+            ((StockChangeService)(AopContext.currentProxy())).save(stockChangeEntity);
+
+        }
+    }
+
+
+    /**
+     * 更新审核状态
+     *
+     * @param ids  要更新的数据
+     * @param type 状态
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateAuditStatus(String[] ids, String type) {
+
+        // 更新库存
+        List<StockChangeEntity> inChangeEntities = new ArrayList<>();
+        List<StockChangeEntity> outChangeEntities = new ArrayList<>();
+        List<StockChangeEntity> stockChangeEntities = queryListByIds(ids);
+        // 审核成功才需要更新库存
+        if (Constants.AuditStatus.AUDIT_SUCCESS.getType().equals(type)) {
+
+            stockChangeEntities = stockChangeEntities.stream().filter(stockChangeEntity -> {
+                log.info("工单号为:{}的审核状态为成功",stockChangeEntity.getId());
+                return !stockChangeEntity.getAudit().equals(Constants.AuditStatus.AUDIT_SUCCESS.getType());
+            }).collect(Collectors.toList());
+
+            stockChangeEntities.forEach(stockChangeEntity -> {
+                String type1 = stockChangeEntity.getType();
+                if (Constants.StockChangeType.item_0.getType().equals(type1)
+                        || Constants.StockChangeType.item_1.getType().equals(type1)) {
+                    inChangeEntities.add(stockChangeEntity);
+                } else if (Constants.StockChangeType.item_3.getType().equals(type1)
+                        || Constants.StockChangeType.item_4.getType().equals(type1)) {
+                    outChangeEntities.add(stockChangeEntity);
+                }
+            });
+
+            if (!CollectionUtils.isEmpty(inChangeEntities)) {
+                List<String> stringList = inChangeEntities.stream().map(StockChangeEntity::getId).collect(Collectors.toList());
+                List<StockChangeRecordEntity> stockChangeRecordEntities = stockChangeRecordService.queryListByParentIds(stringList);
+                productStoreRelaService.updateStockNumberByStorage(stockChangeRecordEntities);
+                goodsService.updateStockNumberByStorage(stockChangeRecordEntities);
+            }
+
+            if (!CollectionUtils.isEmpty(outChangeEntities)) {
+                List<String> stringList = outChangeEntities.stream().map(StockChangeEntity::getId).collect(Collectors.toList());
+                List<StockChangeRecordEntity> stockChangeRecordEntities = stockChangeRecordService.queryListByParentIds(stringList);
+                productStoreRelaService.updateStockNumberByOutbound(stockChangeRecordEntities);
+                goodsService.updateStockNumberByOutbound(stockChangeRecordEntities);
+            }
+        }else if (Constants.AuditStatus.AUDIT_REJECT.getType().equals(type)){
+            ArrayList<String> crjectIdList = new ArrayList<>();
+            for (StockChangeEntity stockChangeEntity : stockChangeEntities) {
+                if (!stockChangeEntity.getAudit().equals(Constants.AuditStatus.AUDIT_SUCCESS.getType())){
+                    crjectIdList.add(stockChangeEntity.getId());
+                }
+            }
+            if (crjectIdList.isEmpty()){
+                log.info("修改出入库单审核状态时,可修改的单号为空!");
+                throw new RRException("选中的单号都为审核成功");
+            }
+            ids =  crjectIdList.toArray(new String[crjectIdList.size()]);
+        }
+
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("auditBy", ShiroUtils.getUserEntity().getUsername());
+        map.put("auditTime",new Date());
+        map.put("type",type);
+        stockChangeDao.updateAuditStatus(map,ids);
+    }
+
+    @Override
+    public List<StockChangeEntity> queryListByIds(String[] ids) {
+        return stockChangeDao.queryListByIds(ids);
+    }
+}

+ 5 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/MkActivitiesScoreServiceImpl.java

@@ -83,6 +83,11 @@ public class MkActivitiesScoreServiceImpl implements MkActivitiesScoreService {
         return mkActivitiesScoreDao.deleteBatch(ids);
     }
 
+    @Override
+    public void deleteBatchByMkaId(int mkaId) {
+        mkActivitiesScoreDao.deleteBatchByMkaId(mkaId);
+    }
+
     /**
      * 导入
      *

+ 42 - 5
kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/MkActivitiesServiceImpl.java

@@ -5,18 +5,21 @@ import com.kmall.admin.dao.mk.MkActivitiesDao;
 import com.kmall.admin.entity.mk.MkActivitiesAssociationEntity;
 import com.kmall.admin.entity.mk.MkActivitiesEntity;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
+import com.kmall.admin.haikong.constant.Constants;
+import com.kmall.admin.service.MkActivitiesPromotionService;
+import com.kmall.admin.service.mk.MkActivitiesScoreService;
 import com.kmall.admin.service.mk.MkActivitiesService;
 import com.kmall.admin.utils.ShiroUtils;
 import com.kmall.common.utils.BeanUtils;
+import com.kmall.common.utils.RRException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 营销活动表Service实现类
@@ -32,6 +35,12 @@ public class MkActivitiesServiceImpl implements MkActivitiesService {
     @Autowired
     private MkActivitiesAssociationDao mkActivitiesAssociationDao;
 
+    @Autowired
+    private MkActivitiesScoreService mkActivitiesScoreService;
+
+    @Autowired
+    private MkActivitiesPromotionService mkActivitiesPromotionService;
+
     @Override
     public MkActivitiesEntity queryObject(Long mkaId) {
         return mkActivitiesDao.queryObject(mkaId);
@@ -60,6 +69,12 @@ public class MkActivitiesServiceImpl implements MkActivitiesService {
 //            return 0;
 //        }
 
+        Integer priority = mkActivities.getPriority();
+
+        if (Objects.isNull(priority)) {
+            throw new RRException(String.format("活动【%s】未设置优先级!", mkaTopic));
+        }
+
         SysUserEntity user = ShiroUtils.getUserEntity();
 
         mkActivities.setCreaterSn(user.getUserId().toString());
@@ -90,15 +105,32 @@ public class MkActivitiesServiceImpl implements MkActivitiesService {
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int delete(Long mkaId) {
+        MkActivitiesEntity mkActivitiesEntity = queryObject(mkaId);
+        deleteByTopic(mkActivitiesEntity);
+        mkActivitiesAssociationDao.deleteByMkaId(mkActivitiesEntity.getMkaId());
         return mkActivitiesDao.delete(mkaId);
     }
 
+    private void deleteByTopic(MkActivitiesEntity mkActivitiesEntity) {
+        int mkaId = mkActivitiesEntity.getMkaId().intValue();
+        if (Constants.ActivityTopicEnum.JFDK.getTopicCode().equals(mkActivitiesEntity.getMkaTopic())) {
+            mkActivitiesScoreService.deleteBatchByMkaId(mkaId);
+        } else if (Constants.ActivityTopicEnum.LSCX.getTopicCode().equals(mkActivitiesEntity.getMkaTopic())) {
+            mkActivitiesPromotionService.deleteBatchByMkaId(mkaId);
+        }
+    }
+
     @Override
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public int deleteBatch(Long[]mkaIds) {
         mkActivitiesDao.deleteBatch(mkaIds);
-
+        List<Integer> integerList = Arrays.stream(mkaIds).map(Long::intValue).collect(Collectors.toList());
+        List<MkActivitiesEntity> mkActivitiesEntities = queryListByMkaIdList(integerList);
+        for (MkActivitiesEntity mkActivitiesEntity : mkActivitiesEntities) {
+            deleteByTopic(mkActivitiesEntity);
+        }
         mkActivitiesAssociationDao.deleteBatch(mkaIds);
         return 1;
     }
@@ -132,4 +164,9 @@ public class MkActivitiesServiceImpl implements MkActivitiesService {
     public List<MkActivitiesEntity> queryByTopic(String storeId, String currentTime, String topic) {
         return mkActivitiesDao.queryByTopic(storeId,currentTime,topic);
     }
+
+    @Override
+    public List<MkActivitiesEntity> queryListByMkaIdList(List<Integer> mkaIdList) {
+        return mkActivitiesDao.queryListByMkaIdList(mkaIdList);
+    }
 }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/service/mk/MkActivitiesScoreService.java

@@ -73,6 +73,8 @@ public interface MkActivitiesScoreService {
      */
     int deleteBatch(Integer[]ids);
 
+    void deleteBatchByMkaId(int mkaId);
+
     /**
      * 导入
      * @param scoreReductionDTOList 导入的数据

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/service/mk/MkActivitiesService.java

@@ -89,4 +89,6 @@ public interface MkActivitiesService {
     List<MkActivitiesEntity> queryByNowByMz(String storeId, String currentTime);
 
     List<MkActivitiesEntity> queryByTopic(String storeId, String format, String topic);
+
+    List<MkActivitiesEntity> queryListByMkaIdList(List<Integer> mkaIdList);
 }

+ 6 - 5
kmall-admin/src/main/java/com/kmall/admin/task/SalsDetailTask.java

@@ -12,9 +12,10 @@ import org.springframework.stereotype.Component;
 /**
  * 线下订单数据推送接口
  */
-@Component("salsDetailTask")
-@EnableScheduling
-@EnableAsync
+//@Component("salsDetailTask")
+//@EnableScheduling
+//@EnableAsync
+@Deprecated
 public class SalsDetailTask {
     private static Log logger = LogFactory.getLog(SalsDetailTask.class);
 
@@ -24,7 +25,7 @@ public class SalsDetailTask {
     /**
      * 每天向eccs推送销售明细数据
      */
-    @Scheduled(cron = "0 30 0 * * ?")
+//    @Scheduled(cron = "0 30 0 * * ?")
     public void pushSalesDetailData() {
         logger.info(">>>>>>>>>>>>>>>>>>>>pushSalesDetailData is start ");
         salesDetailService.pushSalesDetailData();
@@ -34,7 +35,7 @@ public class SalsDetailTask {
     /**
      * 每天向eccs重推销售明细数据
      */
-    @Scheduled(cron = "0 30 0 * * ?")
+//    @Scheduled(cron = "0 30 0 * * ?")
     public void pushSalesDetailDataAgain() {
         logger.info(">>>>>>>>>>>>>>>>>>>>pushSalesDetailDataAgain is start ");
         salesDetailService.pushSalesDetailDataAgain();

+ 2 - 1
kmall-admin/src/main/java/com/kmall/admin/task/SendToEccsTask.java

@@ -21,6 +21,7 @@ import org.springframework.stereotype.Component;
 //@Component("sendToEccsTask")
 //@EnableScheduling
 //@EnableAsync
+@Deprecated
 public class SendToEccsTask {
 
 
@@ -34,7 +35,7 @@ public class SendToEccsTask {
      * 发送数据给中控系统
      * 每天1个小时执行1次
      */
-    @Scheduled(cron = "0 0/1 * * * ?")
+//    @Scheduled(cron = "0 0/1 * * * ?")
 //    @Scheduled(cron = "0 0 0/1 * * ?")
     public void syncOmsHsCode() {
         logger.info("同步所有商品表海关备案编码数据开始-----------------");

+ 6 - 5
kmall-admin/src/main/java/com/kmall/admin/task/SyncOmsTask.java

@@ -16,9 +16,10 @@ import org.springframework.stereotype.Component;
  * @email 1076650290@qq.com
  * @date 2020年11月30日15:33:57
  */
-@Component("syncOmsTask")
-@EnableScheduling
-@EnableAsync
+//@Component("syncOmsTask")
+//@EnableScheduling
+//@EnableAsync
+@Deprecated
 public class SyncOmsTask {
 
     private Logger logger = LoggerFactory.getLogger(getClass());
@@ -31,7 +32,7 @@ public class SyncOmsTask {
      * 同步oms海关备案编码
      * 每天凌晨三点执行一次
      */
-    @Scheduled(cron = "0 0 3 * * ?")
+//    @Scheduled(cron = "0 0 3 * * ?")
     public void syncOmsHsCode() {
         logger.info("syncOmsHsCode同步所有商品表海关备案编码数据开始-----------------");
         try {
@@ -50,7 +51,7 @@ public class SyncOmsTask {
      * 每日同步税率
      * 每天凌晨四点执行一次
      */
-    @Scheduled(cron = "0 0 4 * * ?")
+//    @Scheduled(cron = "0 0 4 * * ?")
     public void syncGoodsRate() {
         logger.info("syncGoodsRate同步所有商品表当前售价海关备案编码对应税率数据开始-----------------");
         try {

+ 30 - 0
kmall-admin/src/main/resources/XmlTemplate/StockChangeDtoList.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workbook>
+    <worksheet name="Sheet1">
+        <section startRow="0" endRow="1"/>
+        <section startRow="2" endRow="2">
+            <mapping cell="A2">StockChangeDto.id</mapping>
+            <mapping cell="B2">StockChangeDto.merchSn</mapping>
+            <mapping cell="C2">StockChangeDto.thirdMerchSn</mapping>
+            <mapping cell="D2">StockChangeDto.storeId</mapping>
+            <mapping cell="E2">StockChangeDto.type</mapping>
+            <mapping cell="F2">StockChangeDto.remark</mapping>
+            <mapping cell="G2">StockChangeDto.time</mapping>
+        </section>
+        <loop startRow="3" endRow="3" items="StockChangeRecordDtoList" var="StockChangeRecordDto"
+              varType="com.kmall.admin.dto.StockChangeRecordDto">
+            <section startRow="3" endRow="3">
+                <mapping row="3" col="0">StockChangeRecordDto.sku</mapping>
+                <mapping row="3" col="1">StockChangeRecordDto.number</mapping>
+                <mapping row="3" col="2">StockChangeRecordDto.orderSn</mapping>
+                <mapping row="3" col="3">StockChangeRecordDto.courierNumber</mapping>
+                <mapping row="3" col="4">StockChangeRecordDto.remark</mapping>
+            </section>
+            <loopbreakcondition>
+                <rowcheck offset="0">
+                    <cellcheck offset="0"></cellcheck>
+                </rowcheck>
+            </loopbreakcondition>
+        </loop>
+    </worksheet>
+</workbook>

+ 23 - 0
kmall-admin/src/main/resources/XmlTemplate/StockChangeRecordDtoList.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workbook>
+    <worksheet name="Sheet1">
+        <section startRow="0" endRow="0"/>
+        <loop startRow="1" endRow="1" items="StockChangeRecordDtoList" var="StockChangeRecordDto"
+              varType="com.kmall.admin.dto.StockChangeRecordDto">
+            <section startRow="1" endRow="1">
+                <mapping row="1" col="0">StockChangeRecordDto.merchSn</mapping>
+                <mapping row="1" col="1">StockChangeRecordDto.thirdMerchSn</mapping>
+                <mapping row="1" col="2">StockChangeRecordDto.storeId</mapping>
+                <mapping row="1" col="3">StockChangeRecordDto.sku</mapping>
+                <mapping row="1" col="4">StockChangeRecordDto.type</mapping>
+                <mapping row="1" col="5">StockChangeRecordDto.number</mapping>
+                <mapping row="1" col="6">StockChangeRecordDto.remark</mapping>
+            </section>
+            <loopbreakcondition>
+                <rowcheck offset="0">
+                    <cellcheck offset="0"></cellcheck>
+                </rowcheck>
+            </loopbreakcondition>
+        </loop>
+    </worksheet>
+</workbook>

+ 36 - 9
kmall-admin/src/main/resources/conf/cuspay/cuspay-ali.properties

@@ -1,31 +1,51 @@
 ########## \u6D77\u5173\u63A8\u652F\u4ED8\u51ED\u8BC1\u901A\u7528\u7248\u672C\u914D\u7F6E ##########
 ########## \u539F\u9879\u76EE\u65E0\u914D\u7F6E\u6587\u4EF6\u6CE8\u91CA ##########
 
+# dev\u4F7F\u7528MD5\u52A0\u5BC6\uFF0Cprod\u4F7F\u7528RSA\u52A0\u5BC6
+ali.payment.encryption = prod
 
-# \u652F\u4ED8\u5B9D
+# \u652F\u4ED8\u5B9D\u65E7\u7248\u672C\u63A5\u53E3\u914D\u7F6E
 ali.payment.declare.url=https://mapi.alipay.com/gateway.do?
 ali.payment.query.url=https://mapi.alipay.com/gateway.do?
 
+# MD5\u5BC6\u94A5 - \u4E2D\u7F51\u5546\u6237
+ali.payment.md5.key=6zo20oar6qufb6x41ipli3yma9ju107h
+# RSA\u5F00\u53D1\u8005\u79C1\u94A5 - \u6D77\u63A7\u63D0\u4F9B PKCS8\u683C\u5F0F
+ali.payment.rsa.private-key=MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDbzYIYhhW8uuulmr0GVci8m2QzgJ/Gxm8b7q2a8yPbf7ZS9efTrzqBryosp3uwIFFJBNZCmVDUOqUUhxPxWBIMNVFNXOff2P+jGb7Ku5Mybde7TweLSuKdU07MA2FqOUvAnLvlJ82D7HI/kQ1pBBc5Ziu4vRhLjEcvXESxkYBm9lhOFt3VSMz9TOOd2JY66HpTloH9PLstqxTWtwl+W5dDHEeC6dUfwcaDDMKSZtCl1XPCaDfrllDrjL6L/meaMs5A58ZyPpV3TOWawhQ6G2ZN8CT4wsxb3FEojxpV/kvmLm6lrxZP/xXVAsA/98eXesyZ9h5HzXBXehBtPDan0sWlAgMBAAECggEAXXE3bl+KXCqGxWdMFqZfaTcSWQbEZgez8ob8TNQymTzo8MnTnV1wHPOvlT46SfzjMYyZ3cQ55Y9s4JYwNzi+q2v7PU1S0gn5W4g1YRBvGlAyF1IYnfHe9w0UgYyqXDMxbhfzlQ7fwsbBJx7uOYfgq6kwyx+wdWWUWaD7HxYBJUOpO96cEY3Z70mlfmPjevlAgF6Bd0GAyz8zASBLs3ie1ILMPZTOlGtSsr3lgSIkmiWZYRzLEmGBRVMUIccBQVbWZqo8D4w8ARX6C/MVLKpDeiFZsM8J4L8+9LI9UmMyi57gBCSPAmcOF/DUob3SnI2IwTox7E7x52GU/s8FJ0qt/QKBgQDxhY4gZi6bFbspm+LnPx5AZefraeX6YLcaUxHIC8h7ZyBlnul+7SnhxTqn+ekAL/FbKJCC/RfF5OM3spV76LiY1e7E39eY92ab2ghEfQ7nb/yUcbUf6NPI4VAUm+2Q3uUknuF/UdJZag3aiEvIGr3LNMJUqQn/+ORUrYYyVOWiKwKBgQDo+qZFtOrEzKRFXBOjnmHlYS5WRt0PgI0MCJ5K2XkvdQV1hLBZfoTAuzSqloKO180vNQ18NadaLoJoQMKxFgalzCTkjoNKeq5BbcMNzxTt5ZkKmE17M3wW2zmHCiNbMcK+510x7eIMLHwjHmdr0zgG7dEjhlUexdmDZs2fVvrfbwKBgG40UrXV6k45jD1gNBjwZA1ecoSovZeRqfsJDIQLXF9ynwW/jSuta/7oz+r1zauYNLkzuT0L310dI9C2XB8+AX07oMeUm/vgZ6GVy0/1AGf6YXYarFrzEjAHH1NIEw6XplcfaCWAYEsMaWXd6zZTfWbLnCClQTrbhtRcmW897cohAoGBAN9qlg6cqtIkqJc28EJkfN6Z7fSgqhbWoOvcS+fdWwAuiRikMPTxhd7I5317LiJLQiG2D4OAdEbf+QB+sfVd+Ov/s5VWMQM4WGi4GGfioOBt3/AwE4VE3weQHT+pcjReqLGnb1CVHcOs2TJYUrcs6zqBzp/xjykedDM1X5Qgth2TAoGBAJB0d+08b09jKGN8lCYJK0uzjzDUHE4sTeADeYzDME+3IdRg9UJ+n5cUHPOfZoLBeIKn0re3ktb+wKpKCbWKm5mpQzfyqs/wA9esVTZC2OYGI/rnWRDxzNFwkzY/t/ffRW0zEIiqORpBXWBwAr3o7LSapQwZx+j2oC82UsqjU0U/
+
 
 #\u5B9A\u65F6\u5668\u62A5\u5173\u4E00\u6B21\u533A\u7684\u6570\u636E
 db.ali.declare.limit=20
 db.ali.declare.count=2
 
+############################################
 
-# \u5546\u6237\u4FE1\u606F
+## \u5F00\u53D1\u73AF\u5883 - \u5546\u6237\u4FE1\u606F
+# \u5E73\u53F0\u7F16\u53F7
+#merchant.plat-sn=146001
+## \u5E73\u53F0\u4E2D\u6587\u540D
+#merchant.plat-name=\u4E2D\u7F51\u5546\u57CE
+## \u5546\u6237\u6D77\u5173\u5907\u6848\u7F16\u53F7
+#merchant.customs-code=4403160Z3Y
+## \u5546\u6237\u6D77\u5173\u5907\u6848\u540D\u79F0
+#merchant.customs-name=\u4E2D\u7F51\u79D1\u6280\uFF08\u6DF1\u5733\uFF09\u6709\u9650\u516C\u53F8
+
+## \u751F\u4EA7\u73AF\u5883 - \u6D77\u63A7\u5546\u6237\u4FE1\u606F
 # \u5E73\u53F0\u7F16\u53F7
-merchant.plat-sn=146001
+merchant.plat-sn=44048600Y8
 # \u5E73\u53F0\u4E2D\u6587\u540D
-merchant.plat-name=\u4E2D\u7F51\u5546\u57CE
+merchant.plat-name=\u73E0\u6D77\u6D77\u63A7\u79D1\u6280\u6709\u9650\u516C\u53F8
 # \u5546\u6237\u6D77\u5173\u5907\u6848\u7F16\u53F7
-merchant.customs-code=4403160Z3Y
+merchant.customs-code=44048600Y8
 # \u5546\u6237\u6D77\u5173\u5907\u6848\u540D\u79F0
-merchant.customs-name=\u4E2D\u7F51\u79D1\u6280\uFF08\u6DF1\u5733\uFF09\u6709\u9650\u516C\u53F8
+merchant.customs-name=\u73E0\u6D77\u6D77\u63A7\u79D1\u6280\u6709\u9650\u516C\u53F8
 
+############################################
 
+## \u5F00\u53D1\u73AF\u5883
 # ccnet\u9ED8\u8BA4\u914D\u7F6E\u6587\u4EF6\u7684\u503C
-cus.play.alipay.partner=2088821582509154
-cus.play.alipay.customs=ZONGSHU
+#cus.play.alipay.partner=2088821582509154
+#cus.play.alipay.customs=ZONGSHU
 
 # ccnet dev\u914D\u7F6E\u6587\u4EF6\u7684\u503C
 #cus.play.alipay.partner=2088821582509154
@@ -33,4 +53,11 @@ cus.play.alipay.customs=ZONGSHU
 
 # ccnet test\u914D\u7F6E\u6587\u4EF6\u7684\u503C
 #cus.play.alipay.partner=2088821582509154
-#cus.play.alipay.customs=ZONGSHU
+#cus.play.alipay.customs=ZONGSHU
+
+
+## \u751F\u4EA7\u73AF\u5883 - \u6D77\u63A7\u652F\u4ED8\u5B9D\u4FE1\u606F
+## \u652F\u4ED8\u5B9D\u5546\u6237\u5408\u4F5C\u4F19\u4F34\u8EAB\u4EFD\uFF08PID\uFF09
+cus.play.alipay.partner=2088731576886261
+# \u6D77\u5173\uFF0C\u5E7F\u5DDE\uFF08\u603B\u7F72\uFF09
+cus.play.alipay.customs=GUANGZHOU_ZS

+ 2 - 2
kmall-admin/src/main/resources/logback.xml

@@ -6,8 +6,8 @@ debug:当此属性设置为true时,将打印出logback内部日志信息,
 -->
 <configuration scan="false" scanPeriod="60 seconds" debug="false">
 
-<!--    <property name="LOG_HOME" value="/data/project/logs/kmall-haikong/kmall-admin/"/>-->
-    <property name="LOG_HOME" value="/app/project/logs/kmall-haikong/kmall-admin/"/>
+    <property name="LOG_HOME" value="/data/project/logs/kmall-haikong/kmall-admin/"/>
+<!--    <property name="LOG_HOME" value="/app/project/logs/kmall-haikong/kmall-admin/"/>-->
     <!-- 定义日志的根目录 -->
     <property name="TRACE_DIR" value="trace" />
     <property name="DEBUG_DIR" value="debug" />

+ 37 - 0
kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml

@@ -221,6 +221,17 @@
         where a.is_delete=0 and a.prod_barcode = #{prodBarcode} and a.goods_biz_type = 11 and r.store_id = #{storeId}
     </select>
 
+    <select id="queryObjectByProdBarcodeAndStoreId" resultType="com.kmall.admin.entity.GoodsEntity">
+        SELECT
+            a.id,a.sku,a.goods_sn,a.name,a.list_pic_url,a.prod_barcode,r.market_price storeMarketPrice,r.retail_price storeRetailPrice ,r.stock_num,s.store_name,r.product_id,s.id 'storeId',
+            a.hs_code as hsCode , a.legal_unit1_qty as legalUnit1Qty , a.legal_unit2_qty as legalUnit2Qty,a.ciq_prod_model as ciqProdModel,a.to_be_restored
+        FROM
+            mall_goods a
+        LEFT JOIN mall_product_store_rela r ON r.goods_id = a.id
+        inner join mall_store s on r.store_id=s.id
+        where a.is_delete=0 and a.prod_barcode = #{prodBarcode} and r.store_id = #{storeId}
+    </select>
+
 
     <select id="queryObjectByProdBarcodeAndStore" resultType="com.kmall.admin.entity.GoodsEntity">
          SELECT
@@ -1152,6 +1163,32 @@
         where
         prod_barcode = #{prodBarcode} and sku = #{sku}
     </update>
+    <update id="updateStockNumberByOutbound">
+        update mall_goods
+        <trim prefix="set" suffixOverrides=",">
+            goods_number =
+            <foreach collection="list" item="item" open="case " close=" end,">
+                when sku = #{item.sku} then goods_number - #{item.number}
+            </foreach>
+        </trim>
+        where
+        <foreach collection="list" item="item" open="(" separator=") or (" close=")">
+            sku = #{item.sku}
+        </foreach>
+    </update>
+    <update id="updateStockNumberByStorage">
+        update mall_goods
+        <trim prefix="set" suffixOverrides=",">
+            goods_number =
+            <foreach collection="list" item="item" open="case " close=" end,">
+                when sku = #{item.sku} then goods_number + #{item.number}
+            </foreach>
+        </trim>
+        where
+        <foreach collection="list" item="item" open="(" separator=") or (" close=")">
+            sku = #{item.sku}
+        </foreach>
+    </update>
 
     <select id="syncOmsHsCodeGoode" resultType="java.lang.String">
         select sku from mall_goods where id in

+ 4 - 1
kmall-admin/src/main/resources/mybatis/mapper/MkActivitiesPromotionDao.xml

@@ -161,8 +161,11 @@
 			#{mapId}
 		</foreach>
 	</delete>
+    <delete id="deleteBatchByMkaId">
+		delete from mk_activities_promotion where mka_id = #{mkaId}
+	</delete>
 
-	<select id="queryByBarCode" resultType="com.kmall.admin.entity.MkActivitiesPromotionEntity">
+    <select id="queryByBarCode" resultType="com.kmall.admin.entity.MkActivitiesPromotionEntity">
 		select
 			`map_id`,
 			`product_name`,

+ 5 - 5
kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml

@@ -2061,9 +2061,8 @@
         g.goods_id,
         o.order_sn as receiptNo,
         u.username as cashRegisterNo,
-
-        o.create_time as timeStampDetails,
         u.username as staffID,
+        o.create_time as timeStampDetails,
         u.username as staffName,
         gs.hs_code as hsCode,
         gs.hs_code_name as hsCodeName,
@@ -2103,6 +2102,7 @@
         left join mall_brand b on b.id=sr.brand_id
         left join mall_supplier sup on gs.supplier_id = sup.id
         WHERE 1=1
+        AND g.number>0
         <if test="orderSn != null and orderSn.trim() != ''">
             AND o.order_sn LIKE concat('%',#{orderSn},'%')
         </if>
@@ -2127,15 +2127,15 @@
             AND s.store_name LIKE concat('%',#{storeName},'%')
         </if>
 
-         union
+        union
 
         SELECT distinct
         o.id,
         g.goods_id,
         o.order_sn as receiptNo,
         u.username as cashRegisterNo,
-        mor.create_time as timeStampDetails,
         u.username as staffID,
+        mor.create_time as timeStampDetails,
         u.username as staffName,
         gs.hs_code as hsCode,
         gs.hs_code_name as hsCodeName,
@@ -2177,6 +2177,7 @@
         left join mall_supplier sup on gs.supplier_id = sup.id
         left join mall_order_refund mor on mor.out_refund_no = o.order_sn
         WHERE 1=1
+        AND g.number>0
         <if test="orderSn != null and orderSn.trim() != ''">
             AND o.order_sn LIKE concat('%',#{orderSn},'%')
         </if>
@@ -2201,7 +2202,6 @@
             AND s.store_name LIKE concat('%',#{storeName},'%')
         </if>
 
-
     </select>
 
     <update id="updateOrderInfo" parameterType="map">

+ 15 - 1
kmall-admin/src/main/resources/mybatis/mapper/OrderProcessRecordDao.xml

@@ -447,7 +447,18 @@ select
 					</if>
 				</foreach>
 			</trim>
-
+			<trim prefix="order_status =case" suffix="end,">
+				<foreach collection="list" item="item" index="index">
+					<if test="item.logisticsNo!=null">
+						when order_sn=#{item.orderSn}
+						then '300'
+					</if>
+					<if test="item.logisticsNo==null">
+						when order_sn=#{item.orderSn}
+						then mall_order.order_status
+					</if>
+				</foreach>
+			</trim>
 			<trim prefix="shipping_code =case" suffix="end,">
 				<foreach collection="list" item="item" index="index">
 					<if test="item.shippingCode!=null">
@@ -528,6 +539,9 @@ select
 			<if test="invtNo != null">
 				invt_no = #{invtNo},
 			</if>
+			<if test="clearMsg != null">
+				customs_msg = #{clearMsg},
+			</if>
 		</set>
 		where order_sn = #{orderSn,jdbcType=VARCHAR}
 	</update>

+ 27 - 0
kmall-admin/src/main/resources/mybatis/mapper/ProductStoreRelaDao.xml

@@ -976,6 +976,33 @@
         </foreach>
     </update>
 
+    <update id="updateStockNumberByOutbound">
+        update mall_product_store_rela
+        <trim prefix="set" suffixOverrides=",">
+            stock_num =
+            <foreach collection="list" item="item" open="case " close=" end,">
+                when sku = #{item.sku} and store_id = #{item.storeId} then stock_num - #{item.number}
+            </foreach>
+        </trim>
+        where
+        <foreach collection="list" item="item" open="(" separator=") or (" close=")">
+            sku = #{item.sku} and store_id = #{item.storeId}
+        </foreach>
+    </update>
+    <update id="updateStockNumberByStorage">
+        update mall_product_store_rela
+        <trim prefix="set" suffixOverrides=",">
+            stock_num =
+            <foreach collection="list" item="item" open="case " close=" end,">
+                when sku = #{item.sku} and store_id = #{item.storeId} then stock_num + #{item.number}
+            </foreach>
+        </trim>
+        where
+        <foreach collection="list" item="item" open="(" separator=") or (" close=")">
+            sku = #{item.sku} and store_id = #{item.storeId}
+        </foreach>
+    </update>
+
 
     <select id="queryByGoodsIdAndStoreIdHkMall" resultType="com.kmall.admin.entity.ProductStoreRelaEntity">
         select

+ 40 - 0
kmall-admin/src/main/resources/mybatis/mapper/StoreMngChangeDao.xml

@@ -172,6 +172,46 @@
 			#{orderSn})
 	</insert>
 
+	<insert id="saveBatch" parameterType="com.kmall.admin.entity.StoreMngChangeEntity">
+		insert into mall_store_mng_change(
+			`store_change_num`,
+			`store_original_num`,
+			`store_valid_num`,
+			`merch_sn`,
+			`store_id`,
+			`goods_id`,
+			`is_valid`,
+			`change_type`,
+			`change_reason`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`,
+			order_sn)
+		values
+		<foreach collection="list" item="item" separator=",">
+			(
+				#{item.storeChangeNum},
+				#{item.storeOriginalNum},
+				#{item.storeValidNum},
+				#{item.merchSn},
+				#{item.storeId},
+				#{item.goodsId},
+				#{item.isValid},
+				#{item.changeType},
+				#{item.changeReason},
+				#{item.createrSn},
+				#{item.createTime},
+				#{item.moderSn},
+				#{item.modTime},
+				#{item.tstm},
+				#{item.orderSn}
+			)
+		</foreach>
+	</insert>
+
+
 	<update id="update" parameterType="com.kmall.admin.entity.StoreMngChangeEntity">
 		update mall_store_mng_change
 		<set>

+ 33 - 0
kmall-admin/src/main/resources/mybatis/mapper/haikong/HaikongSendOrderInfoRecordDao.xml

@@ -373,6 +373,39 @@
 			#{item.id}
 		</foreach>
 	</update>
+	<update id="updateByOrderSn">
+		update haikong_send_order_info_record
+		<set>
+			<if test="payApp != null">`pay_app` = #{payApp}, </if>
+			<if test="dlytypeCode != null">`dlytype_code` = #{dlytypeCode}, </if>
+			<if test="consigneeName != null">`consignee_name` = #{consigneeName}, </if>
+			<if test="consigneeAreaProvince != null">`consignee_area_province` = #{consigneeAreaProvince}, </if>
+			<if test="consigneeAreaCity != null">`consignee_area_city` = #{consigneeAreaCity}, </if>
+			<if test="consigneeAreaCounty != null">`consignee_area_county` = #{consigneeAreaCounty}, </if>
+			<if test="consigneeAddress != null">`consignee_address` = #{consigneeAddress}, </if>
+			<if test="consigneeZip != null">`consignee_zip` = #{consigneeZip}, </if>
+			<if test="consigneeTel != null">`consignee_tel` = #{consigneeTel}, </if>
+			<if test="consigneeEmail != null">`consignee_email` = #{consigneeEmail}, </if>
+			<if test="consigneeMobile != null">`consignee_mobile` = #{consigneeMobile}, </if>
+			<if test="weight != null">`weight` = #{weight}, </if>
+			<if test="quantity != null">`quantity` = #{quantity}, </if>
+			<if test="orderTotal != null">`order_total` = #{orderTotal}, </if>
+			<if test="platform != null">`platform` = #{platform}, </if>
+			<if test="money != null">`money` = #{money}, </if>
+			<if test="payMode != null">`pay_mode` = #{payMode}, </if>
+			<if test="request != null">`request` = #{request}, </if>
+			<if test="response != null">`response` = #{response}, </if>
+			<if test="outTradeNo != null">`out_trade_no` = #{outTradeNo}, </if>
+			<if test="seaportCode != null">`seaport_code` = #{seaportCode}, </if>
+			<if test="seaportPlatform != null">`seaport_platform` = #{seaportPlatform}, </if>
+			<if test="identityCard != null">`identity_card` = #{identityCard}, </if>
+			<if test="identityName != null">`identity_name` = #{identityName}, </if>
+			<if test="identityMobile != null">`identity_mobile` = #{identityMobile}, </if>
+			<if test="orderProductInfo != null">`order_product_info` = #{orderProductInfo}, </if>
+			<if test="resendStatus != null">`resend_status` = #{resendStatus}</if>
+		</set>
+		where outer_order_no = #{outerOrderNo}
+	</update>
 
 	<delete id="delete">
 		delete from haikong_send_order_info_record where id = #{value}

+ 200 - 0
kmall-admin/src/main/resources/mybatis/mapper/haikong/StockChangeDao.xml

@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kmall.admin.dao.haikong.StockChangeDao">
+
+    <resultMap type="com.kmall.admin.entity.haikong.StockChangeEntity" id="stockChangeMap">
+        <result property="id" column="id"/>
+        <result property="type" column="type"/>
+        <result property="time" column="time"/>
+        <result property="merchSn" column="merch_sn"/>
+        <result property="merch" column="merch"/>
+        <result property="storeId" column="store_id"/>
+        <result property="store" column="store"/>
+        <result property="thirdMerchSn" column="third_merch_sn"/>
+        <result property="audit" column="audit"/>
+        <result property="thirdMerch" column="third_merch"/>
+        <result property="remark" column="remark"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="modifyBy" column="modify_by"/>
+        <result property="modifyTime" column="modify_time"/>
+        <result property="auditBy" column="audit_by"/>
+        <result property="auditTime" column="audit_time"/>
+    </resultMap>
+
+	<select id="queryObject" resultType="com.kmall.admin.entity.haikong.StockChangeEntity">
+		select
+			`id`,
+			`type`,
+			`time`,
+			`merch_sn`,
+			`merch`,
+			`store_id`,
+			`store`,
+			`third_merch_sn`,
+			`audit`,
+			`third_merch`,
+			`remark`,
+			`create_by`,
+			`create_time`,
+			`modify_by`,
+			`modify_time`,
+			`audit_by`,
+			`audit_time`
+		from mall_stock_change
+		where id = #{id}
+	</select>
+
+	<select id="queryList" resultType="com.kmall.admin.entity.haikong.StockChangeEntity">
+		select
+    		c.`id`,
+			c.`type`,
+			c.`time`,
+			c.`merch_sn`,
+    		c.`merch`,
+    		c.`store_id`,
+    		c.`store`,
+			c.`third_merch_sn`,
+			c.`audit`,
+			c.`third_merch`,
+			c.`remark`,
+			c.`create_by`,
+			c.`create_time`,
+			c.`modify_by`,
+			c.`modify_time`,
+			c.`audit_by`,
+			c.`audit_time`
+		from mall_stock_change c
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND c.name LIKE concat('%',#{name},'%')
+		</if>
+		<if test="orderId != null and orderId.trim() != ''">
+			AND c.id = #{orderId}
+		</if>
+		<if test="type != null and type.trim() != ''">
+			AND c.type = #{type}
+		</if>
+
+		<if test="time != null and time.trim() != ''">
+			AND c.time &gt; #{time}
+		</if>
+		<if test="audit != null and audit.trim() != ''">
+			AND c.audit = #{audit}
+		</if>
+		<if test="storeId != null and storeId.trim() != ''">
+			AND c.store_id = #{storeId}
+		</if>
+		<choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by c.id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from mall_stock_change
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+
+
+	<select id="queryListByIds" resultType="com.kmall.admin.entity.haikong.StockChangeEntity">
+		select * from mall_stock_change
+		where id in
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</select>
+
+	<insert id="save" parameterType="com.kmall.admin.entity.haikong.StockChangeEntity">
+		insert into mall_stock_change(
+			`id`,
+			`type`,
+			`time`,
+			`merch_sn`,
+			`merch`,
+			`store_id`,
+			`store`,
+			`third_merch_sn`,
+			`audit`,
+			`third_merch`,
+			`remark`,
+			`create_by`,
+			`create_time`,
+			`modify_by`,
+			`modify_time`,
+			`audit_by`,
+			`audit_time`)
+		values(
+			#{id},
+			#{type},
+			#{time},
+			#{merchSn},
+			#{merch},
+			#{storeId},
+			#{store},
+			#{thirdMerchSn},
+			#{audit},
+			#{thirdMerch},
+			#{remark},
+			#{createBy},
+			#{createTime},
+			#{modifyBy},
+			#{modifyTime},
+			#{auditBy},
+			#{auditTime})
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.admin.entity.haikong.StockChangeEntity">
+		update mall_stock_change 
+		<set>
+			<if test="type != null">`type` = #{type}, </if>
+			<if test="time != null">`time` = #{time}, </if>
+			<if test="merchSn != null">`merch_sn` = #{merchSn}, </if>
+			<if test="merch != null">`merch` = #{merch}, </if>
+			<if test="storeId != null">`store_id` = #{storeId}, </if>
+			<if test="store != null">`store` = #{store}, </if>
+			<if test="thirdMerchSn != null">`third_merch_sn` = #{thirdMerchSn}, </if>
+			<if test="audit != null">`audit` = #{audit}, </if>
+			<if test="thirdMerch != null">`third_merch` = #{thirdMerch}, </if>
+			<if test="remark != null">`remark` = #{remark}, </if>
+			<if test="createBy != null">`create_by` = #{createBy}, </if>
+			<if test="createTime != null">`create_time` = #{createTime}, </if>
+			<if test="modifyBy != null">`modify_by` = #{modifyBy}, </if>
+			<if test="modifyTime != null">`modify_time` = #{modifyTime}, </if>
+			<if test="auditBy != null">`audit_by` = #{auditBy}, </if>
+			<if test="auditTime != null">`audit_time` = #{auditTime}</if>
+		</set>
+		where id = #{id}
+	</update>
+
+    <update id="updateAuditStatus" >
+		update mall_stock_change set audit = #{map.type},audit_by =#{map.auditBy},audit_time=#{map.auditTime}
+		where id in
+		<foreach collection="ids" item="ids" open="(" separator="," close=")">
+			#{ids}
+		</foreach>
+	</update>
+
+    <delete id="delete">
+		delete from mall_stock_change where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mall_stock_change where id in 
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+</mapper>

+ 186 - 0
kmall-admin/src/main/resources/mybatis/mapper/haikong/StockChangeRecordDao.xml

@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kmall.admin.dao.haikong.StockChangeRecordDao">
+
+    <resultMap type="com.kmall.admin.entity.haikong.StockChangeRecordEntity" id="stockChangeRecordMap">
+        <result property="id" column="id"/>
+        <result property="specification" column="specification"/>
+        <result property="product" column="product"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="courierNumber" column="courier_number"/>
+        <result property="sku" column="sku"/>
+        <result property="type" column="type"/>
+        <result property="number" column="number"/>
+        <result property="remark" column="remark"/>
+        <result property="orderSn" column="order_sn"/>
+        <result property="thirdMerchSn" column="third_merch_sn"/>
+        <result property="merchSn" column="merch_sn"/>
+        <result property="storeId" column="store_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="modifyTime" column="modify_time"/>
+    </resultMap>
+
+	<select id="queryObject" resultMap="stockChangeRecordMap">
+		select
+			*
+		from mall_stock_change_record
+		where id = #{id}
+	</select>
+
+	<select id="queryList" resultMap="stockChangeRecordMap">
+		select
+    		*
+		from mall_stock_change_record
+		WHERE 1=1
+		<if test="type != null and type.trim() != ''">
+			AND `type` LIKE concat('%',#{type},'%')
+		</if>
+		<if test="sku != null and sku.trim() != ''">
+			AND `sku` LIKE concat('%',#{sku},'%')
+		</if>
+		<if test="parentId != null and parentId.trim() != ''">
+			AND `parent_id` LIKE concat('%',#{parentId},'%')
+		</if>
+		<if test="storeId != null and storeId.trim() != ''">
+			AND `store_id` LIKE concat('%',#{storeId},'%')
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from mall_stock_change_record
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+	<select id="queryListByParentIds" resultType="com.kmall.admin.entity.haikong.StockChangeRecordEntity">
+		select * from mall_stock_change_record
+		where parent_id in
+		<foreach collection="list" item="item" open="(" separator="," close=")">
+			#{item}
+		</foreach>
+	</select>
+
+	<insert id="save" parameterType="com.kmall.admin.entity.haikong.StockChangeRecordEntity" useGeneratedKeys="true" keyProperty="id">
+		insert into mall_stock_change_record(
+			`specification`,
+			`product`,
+			`order_sn`,
+			`parent_id`,
+			`courier_number`,
+			`sku`,
+			`type`,
+			`number`,
+			`remark`,
+			`third_merch_sn`,
+			`merch_sn`,
+			`store_id`,
+			`create_time`,
+			`modify_time`)
+		values(
+			#{specification},
+			#{product},
+			#{orderSn},
+			#{parentId},
+			#{courierNumber},
+			#{sku},
+			#{type},
+			#{number},
+			#{remark},
+			#{thirdMerchSn},
+			#{merchSn},
+			#{storeId},
+			#{createTime},
+			#{modifyTime})
+	</insert>
+
+	<insert id="saveBatch">
+		insert into mall_stock_change_record
+		(
+			`specification`,
+			`product`,
+			`order_sn`,
+			`parent_id`,
+			`courier_number`,
+			`sku`,
+			`type`,
+			`number`,
+			`remark`,
+			`third_merch_sn`,
+			`merch_sn`,
+			`store_id`,
+			`create_time`,
+			`modify_time`
+		)
+		values
+		<foreach collection="list" item="item" separator=",">
+			(
+				#{item.specification},
+				#{item.product},
+				#{item.orderSn},
+				#{item.parentId},
+				#{item.courierNumber},
+				#{item.sku},
+				#{item.type},
+				#{item.number},
+				#{item.remark},
+				#{item.thirdMerchSn},
+				#{item.merchSn},
+				#{item.storeId},
+				#{item.createTime},
+				#{item.modifyTime}
+			)
+		</foreach>
+	</insert>
+
+	<update id="update" parameterType="com.kmall.admin.entity.haikong.StockChangeRecordEntity">
+		update mall_stock_change_record 
+		<set>
+			<if test="specification != null">`specification` = #{specification}, </if>
+			<if test="product != null">`product` = #{product}, </if>
+			<if test="parentId != null">`parent_id` = #{parentId}, </if>
+			<if test="courierNumber != null">`courier_number` = #{courierNumber}, </if>
+			<if test="orderSn != null">`order_sn` = #{orderSn}, </if>
+			<if test="sku != null">`sku` = #{sku}, </if>
+			<if test="type != null">`type` = #{type}, </if>
+			<if test="number != null">`number` = #{number}, </if>
+			<if test="remark != null">`remark` = #{remark}, </if>
+			<if test="thirdMerchSn != null">`third_merch_sn` = #{thirdMerchSn}, </if>
+			<if test="merchSn != null">`merch_sn` = #{merchSn}, </if>
+			<if test="storeId != null">`store_id` = #{storeId}, </if>
+			<if test="createTime != null">`create_time` = #{createTime}, </if>
+			<if test="modifyTime != null">`modify_time` = #{modifyTime}</if>
+		</set>
+		where id = #{id}
+	</update>
+	
+	<delete id="delete">
+		delete from mall_stock_change_record where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mall_stock_change_record where id in 
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
+	<delete id="deleteBatchByParentIds">
+		delete from mall_stock_change_record where parent_id in
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+</mapper>

+ 4 - 1
kmall-admin/src/main/resources/mybatis/mapper/mk/MkActivitiesAssociationDao.xml

@@ -142,8 +142,11 @@
 			#{mkaId}
 		</foreach>
 	</delete>
+    <delete id="deleteByMkaId">
+		delete from mk_activities_association where mka_id = #{mkaId}
+	</delete>
 
-	<update id="updateByMkaId" parameterType="com.kmall.admin.entity.mk.MkActivitiesAssociationEntity">
+    <update id="updateByMkaId" parameterType="com.kmall.admin.entity.mk.MkActivitiesAssociationEntity">
 		update mk_activities_association
 		<set>
 			<if test="mkCode != null">`mk_code` = #{mkCode}, </if>

+ 7 - 0
kmall-admin/src/main/resources/mybatis/mapper/mk/MkActivitiesDao.xml

@@ -226,4 +226,11 @@
 			and mka_topic = 'mz'
 			and mka_status = 1
 	</select>
+
+    <select id="queryListByMkaIdList" resultMap="mkActivitiesMap">
+		select * from mk_activities where mka_id in
+		<foreach collection="list" open="(" separator="," close=")" item="item">
+			#{item}
+		</foreach>
+	</select>
 </mapper>

+ 3 - 0
kmall-admin/src/main/resources/mybatis/mapper/mk/MkActivitiesScoreDao.xml

@@ -185,5 +185,8 @@
 			#{id}
 		</foreach>
 	</delete>
+    <delete id="deleteBatchByMkaId">
+		delete from mk_activities_score where mka_id = #{mkaId}
+	</delete>
 
 </mapper>

+ 19 - 19
kmall-admin/src/main/resources/spring/spring-mvc.xml

@@ -23,25 +23,25 @@
     <!-- 暴露代理对象,用来保证调用当前bean的其他方法事务不失效,获取当前bean代理对象:((需要转换的Service) AopContext.currentProxy()) -->
     <aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>
     <mvc:annotation-driven>
-        <mvc:message-converters register-defaults="true">
-            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
-                <property name="supportedMediaTypes">
-                    <list>
-                        <value>text/html;charset=UTF-8</value>
-                        <value>application/json;charset=UTF-8</value>
-                    </list>
-                </property>
-                <property name="features">
-                    <list>
-                        <value>WriteMapNullValue</value>
-                        <value>QuoteFieldNames</value>
-                        <value>WriteDateUseDateFormat</value>
-                        <!-- 禁用fastjson循环引用检测 -->
-                        <value>DisableCircularReferenceDetect</value>
-                    </list>
-                </property>
-            </bean>
-        </mvc:message-converters>
+<!--        <mvc:message-converters register-defaults="true">-->
+<!--            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">-->
+<!--                <property name="supportedMediaTypes">-->
+<!--                    <list>-->
+<!--                        <value>text/html;charset=UTF-8</value>-->
+<!--                        <value>application/json;charset=UTF-8</value>-->
+<!--                    </list>-->
+<!--                </property>-->
+<!--                <property name="features">-->
+<!--                    <list>-->
+<!--                        <value>WriteMapNullValue</value>-->
+<!--                        <value>QuoteFieldNames</value>-->
+<!--                        <value>WriteDateUseDateFormat</value>-->
+<!--                        &lt;!&ndash; 禁用fastjson循环引用检测 &ndash;&gt;-->
+<!--                        <value>DisableCircularReferenceDetect</value>-->
+<!--                    </list>-->
+<!--                </property>-->
+<!--            </bean>-->
+<!--        </mvc:message-converters>-->
     </mvc:annotation-driven>
 
     <!-- 为了加载拦截器 需要 日志拦截器 (登录拦截和权限拦截已在shiro实现,看实现 情况处理) -->

+ 4 - 1
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiespromotion.html

@@ -56,7 +56,10 @@
                 <i-input v-model="mkActivitiesPromotion.productBrand" placeholder="商品品牌"/>
             </Form-item>
             <Form-item label="是否参与积分抵扣" prop="rejectScore">
-                <i-input v-model="mkActivitiesPromotion.rejectScore" placeholder="是否参与积分抵扣,0:参与,1:不参与"/>
+                <i-select v-model="mkActivitiesPromotion.rejectScore" placeholder="是否参与积分抵扣,0:参与,1:不参与">
+                    <i-option value="0">参与</i-option>
+                    <i-option value="1">不参与</i-option>
+                </i-select>
             </Form-item>
             <Form-item label="商品系列" prop="productSeries">
                 <i-input v-model="mkActivitiesPromotion.productSeries" placeholder="商品系列"/>

+ 4 - 1
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiesscore.html

@@ -53,7 +53,10 @@
             </Form-item>
             <Form-item label="是否参与积分抵扣" prop="reject">
                 <p>只能有一种情况,如果积分抵扣商品中都为0,则默认这些商品为参与,其余商品不参与,如果积分抵扣商品都为1,其余商品都参与</p>
-                <i-input v-model="mkActivitiesScore.reject" placeholder="0:参与,1:不参与"/>
+                <i-select v-model="mkActivitiesScore.reject" placeholder="0:参与,1:不参与" style="width: 268px;">
+                    <i-option value="0" >参与</i-option>
+                    <i-option value="1" >不参与</i-option>
+                </i-select>
             </Form-item>
             <!--<Form-item label="抵扣比例" prop="scoreLimit">
                 <i-input v-model="mkActivitiesScore.scoreLimit" placeholder="抵扣比例"/>

+ 66 - 9
kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html

@@ -125,6 +125,7 @@
                                     <span style="margin-right: 40px">&nbsp; 门店:<b>{{storeName}}</b></span>
                                 </li>
                                 <li><span style="margin-right: 35px"><i class="fa fa-user-circle" ></i> &nbsp;收银员:<b>{{sysUserInfo.username}}</b></span></li>
+                                <li><a href="javascript:;" @click="updatePasswordOpen"><i class="fa fa-lock"></i> &nbsp;修改密码</a></li>
                                 <li><a @click="logout" style="font-size: 1em"><i class="fa fa fa-sign-out"></i> 退出</a></li>
                             </ul>
                         </Row>
@@ -205,6 +206,15 @@
                         </table>
                     </li>
                     <li>
+                        <div style="margin-bottom: 10PX">
+                            <h3 style="border: white;padding: 8px">会员手机号:{{userInfo.customPhone}}</h3>
+                        </div>
+                        <ul style="display: inline-block">
+                            <li><h3 style="border: white;padding: 8px;">会员当前积分:{{memberCurrentAvailableScore}}</h3></li>
+                            <li><h3 style="border: white;padding: 8px;">抵扣积分:{{deductionScore}}</h3></li>
+                            <li><h3 style="border: white;padding: 8px;">会员等级:{{levelName}}</h3></li>
+                        </ul>
+                        <div style="width: 30px; display: inline-block"></div>
                         <ul style="display: inline-block">
                             <li><h3 style="border: white;padding: 8px;">总件数:{{totalCount}}</h3></li>
                             <li><h3 style="border: white;padding: 8px;">总价:{{totalPrice}}</h3></li>
@@ -212,12 +222,6 @@
                             <li><h3 style="border: white;padding: 8px">实际支付价:{{actualPrice}}</h3></li>
                             <li v-if="showReduceMoney != 0"><h3 style="border: white;padding: 8px">满减:{{showReduceMoney}}</h3></li>
                         </ul>
-                        <div style="width: 30px; display: inline-block"></div>
-                        <ul style="display: inline-block">
-                            <li><h3 style="border: white;padding: 8px;">会员当前积分:{{memberCurrentAvailableScore}}</h3></li>
-                            <li><h3 style="border: white;padding: 8px;">抵扣积分:{{deductionScore}}</h3></li>
-                            <li><h3 style="border: white;padding: 8px;">会员等级:{{levelName}}</h3></li>
-                        </ul>
                     </li>
                     <li  style="height: 100px;">
                         <i-button type="error" @click="clearGoodsList" class="goods-button"><i class="fa fa-pencil-square-o"></i>&nbsp;清空</i-button>
@@ -298,7 +302,40 @@
                                         <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                                         <button type="button" class="btn btn-primary" @click="queryIDCardInfo">查询身份信息</button>
                                         <button type="button" class="btn btn-primary" @click="getIDCardInfo" id="IDCard">读取身份证信息</button>
-                                        <button type="button" class="btn btn-primary" @click="submitCustomInfo" id="Send">去付款</button>
+                                        <button type="button" class="btn btn-primary" @click="idCardVerification" id="Send" style="background-color:red;">去付款</button>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="modal fade" id="updatePasswordDialog"  role="dialog" aria-hidden="true">
+                            <div class="modal-dialog">
+                                <div class="modal-content">
+                                    <div class="modal-header">
+                                        <button type="button" class="close" data-dismiss="modal" @click="closeUpdatePasswordDialog" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                                        <h4 class="modal-title" id="updatePasswordLabel">修改密码</h4>
+                                    </div>
+                                    <div class="modal-body">
+                                        <div>
+                                            <label class="control-label">账号:</label>
+                                            <span class="label label-success" style="vertical-align: center;">{{sysUserInfo.username}}</span>
+                                        </div>
+                                        <div style="margin-top: 30px">
+                                            <label class="control-label" for="oldPassword">原密码:</label>
+                                            <input type="password" class="form-control" v-model="oldPassword" ref="oldPassword" size="40%" id="oldPassword" />
+                                        </div>
+                                        <div style="margin-top: 30px">
+                                            <label class="control-label" for="newPassword">新密码:</label>
+                                            <input type="text" class="form-control" v-model="newPassword" ref="newPassword" size="40%" id="newPassword" />
+                                        </div>
+<!--                                        <div style="margin-top: 30px">-->
+<!--                                            <label class="control-label" for="newPassword2">再次输入新密码:</label>-->
+<!--                                            <input type="text" class="form-control" v-model="newPassword2" ref="newPassword2" size="40%" id="newPassword2" />-->
+<!--                                        </div>-->
+                                    </div>
+                                    <div class="modal-footer">
+                                        <button type="button" class="btn btn-default" data-dismiss="modal" @click="closeUpdatePasswordDialog" >关闭</button>
+                                        <button type="button" class="btn btn-primary" @click="updatePassword">修改</button>
                                     </div>
                                 </div>
                             </div>
@@ -314,7 +351,11 @@
                                     <div class="modal-body">
                                         <div>
                                             <label for="customPhone" class="control-label">会员码:</label>
-                                            <input autocomplete="off" type="text" ref="couponBarCode" size="60%" id="couponBarCode" @on-enter="calculateOrderPriceSubmit" />
+                                            <input autocomplete="off" type="text" v-model="memberCode" ref="couponBarCode" size="60%" id="couponBarCode" @on-enter="calculateOrderPriceSubmit" />
+                                        </div>
+                                        <div style="margin-top: 30px">
+                                            <label class="control-label" >是否使用积分进行抵扣:</label>
+                                            <i-switch v-model="switch1" on />
                                         </div>
                                     </div>
                                     <div class="modal-footer">
@@ -334,6 +375,21 @@
                                         <h4 class="modal-title" id="payModalLabel">付款码</h4>
                                     </div>
                                     <div class="modal-body">
+                                        <div style="margin-bottom: 10PX">
+                                            <h3 style="border: white;padding: 8px">会员手机号:{{userInfo.customPhone}}</h3>
+                                        </div>
+                                        <div style="margin-bottom: 30px">
+                                            <ul style="display: inline-block">
+                                                <li><h3 style="border: white;padding: 8px">会员等级:{{levelName}}</h3></li>
+                                                <li><h3 style="border: white;padding: 8px">会员当前积分:{{memberCurrentAvailableScore}}</h3></li>
+                                                <li><h3 style="border: white;padding: 8px">抵扣积分:{{deductionScore}}</h3></li>
+                                            </ul>
+                                            <ul style="display: inline-block">
+                                                <li><h3 style="border: white;padding: 8px;">总件数:{{totalCount}}</h3></li>
+                                                <li><h3 style="border: white;padding: 8px;">总价:{{totalPrice}}</h3></li>
+                                                <li><h3 style="border: white;padding: 8px;color: red;">实际支付价:{{actualPrice}}</h3></li>
+                                            </ul>
+                                        </div>
                                         <form>
                                             <div class="form-group">
                                                 <i-input id="payCode" class="payCodeInput" @on-enter="submitOrder" ref="payCode" size="60%" placeholder="请输入付款码"/>
@@ -376,7 +432,7 @@
                         <div class="modal-body">
                                 <div class="row" style="border:0">
                                     <div class="col-md-3" id="orderNo">订单编号: {{orderEntity.orderSn}}</div>
-                                    <div class="col-md-3" id="serialNumber">支付流水号: <span>{{orderProcessRecord.payTransactionId}}</span></div>
+                                    <div class="col-md-3" id="serialNumber">支付流水号: <span>{{orderEntity.payTransactionId}}</span></div>
                                     <div class="col-md-3" id="waybillNo">运单编号: {{orderProcessRecord.logisticsNo}}</div>
                                     <div class="col-md-3" id="inventoryNo">清单编号: {{orderProcessRecord.invtNo}}</div>
                                 </div>
@@ -464,6 +520,7 @@
 <!--                            <button type="button" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-warning" @click="confirmDelivery" id="confirmDelivery" data-dismiss="modal">确定提货</button>-->
 <!--                            <button type="button" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-primary" @click="resendNotice" id="resendNotice" data-dismiss="modal">重发通知</button>-->
 <!--                            <button type="button" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-primary" @click="resendWaybill" id="resendWaybill" data-dismiss="modal">重发运单</button>-->
+                            <button type="button" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-primary" @click="resendorderinfo" id="resendorderinfo" data-dismiss="modal">重推订单信息</button>
                             <button type="button" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-primary" @click="resendorder" id="resendorder" data-dismiss="modal">重发订单</button>
                             <button type="button" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-primary" @click="resendPayment" id="resendPayment" data-dismiss="modal">重发支付单</button>
 <!--                            <button type="button" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-primary" @click="resendOrder" id="resendOrder" data-dismiss="modal">重发订单</button>-->

+ 15 - 8
kmall-admin/src/main/webapp/WEB-INF/page/shop/offilineOrderList.html

@@ -49,7 +49,7 @@
                 <i-button @click="reloadSearch">重置</i-button>
             </div>
             <div>
-                <i-button type="info" @click="checkOrderRestore"></i>&nbsp;查验单恢复库存</i-button>
+<!--                <i-button type="info" @click="checkOrderRestore"></i>&nbsp;查验单恢复库存</i-button>-->
                 #if($shiro.hasPermission("order:exportOffilineOrder"))
                 <i-button type="primary" @click="exportOffilineOrder"><i class="fa fa-cloud-download"></i>&nbsp;导出</i-button>
                 #end
@@ -146,15 +146,15 @@
                             </Radio>
                         </Radio-group>
                     </Form-item>
-                    <!--<Form-item label="收货人" prop="consignee">-->
-                        <!--<i-input v-model="order.consignee" readonly/>-->
-                    <!--</Form-item>-->
+                    <Form-item label="收货人" prop="payName">
+                        <i-input v-model="order.payName" readonly/>
+                    </Form-item>
                     <!--<Form-item label="收货地址" prop="address">-->
                         <!--<i-input v-model="order.address" readonly/>-->
                     <!--</Form-item>-->
-                    <!--<Form-item label="联系电话" prop="mobile">-->
-                        <!--<i-input v-model="order.mobile" readonly/>-->
-                    <!--</Form-item>-->
+                    <Form-item label="手机号" prop="mobile">
+                        <i-input v-model="order.mobile" readonly/>
+                    </Form-item>
                     <!--<Form-item label="客户留言" prop="postscript">-->
                         <!--<i-input v-model="order.postscript" readonly/>-->
                     <!--</Form-item>-->
@@ -215,7 +215,7 @@
                             <p style="line-height: 30px;">SKU:{{item.sku}}</p>
                         </td>
                         <td align="center">¥{{item.number * item.marketPrice}}</td>
-                        <td align="center">¥{{item.number * item.discountedPrice}}</td>
+                        <td align="center">¥{{item.discountedPrice}}</td>
                         <td align="center">¥{{item.actualPaymentAmount}}</td>
                         <td align="center">¥{{item.actualPaymentAmount}}</td>
                         <td align="center">¥{{item.tax}}</td>
@@ -234,9 +234,16 @@
                         <td align="center">¥{{order.orderPrice}}</td>
                         <td align="center">¥{{order.fullCutPrice}}</td>
                         <td align="center">¥{{order.actualPrice}}</td>
+
                         <td align="center" v-show="order.payStatus == 0">未付款</td>
                         <td align="center" v-show="order.payStatus == 1">付款中</td>
                         <td align="center" v-show="order.payStatus == 2 || order.payStatus == 4">¥{{order.actualPrice}}</td>
+                        <td align="center" v-show="order.payStatus == 3 ">退款中</td>
+                        <td align="center" v-show="order.payStatus == 5 ">退款关闭</td>
+                        <td align="center" v-show="order.payStatus == 6 ">退款异常</td>
+                        <td align="center" v-show="order.payStatus == 7 ">订单关闭</td>
+                        <td align="center" v-show="order.payStatus == 8 ">支付失败</td>
+
                         <td align="center">¥{{order.tax}}</td>
                     </tr>
                 </table>

+ 125 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/stockchange.html

@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-col span="4">
+                    <i-input v-model="q.orderId" @on-enter="query" placeholder="单号"/>
+                </i-col>
+                <i-col span="3">
+                    <i-select v-model="q.type" placeholder="类型" filterable label-in-value>
+                        <i-option v-for="stockChangeType in stockChangeTypes" :value="stockChangeType.value"
+                                  :key="stockChangeType.id">{{stockChangeType.name}}
+                        </i-option>
+                    </i-select>
+                </i-col>
+                <i-col span="4">
+                    <i-input v-model="q.time" @on-enter="query" placeholder="出入库时间" type="date" />
+                </i-col>
+                <i-col span="3">
+                    <i-select v-model="q.audit" placeholder="审核状态" filterable label-in-value >
+                        <i-option v-for="stockChangeAudit in stockChangeAudits" :value="stockChangeAudit.value"
+                                  :key="stockChangeAudit.id">{{stockChangeAudit.name}}
+                        </i-option>
+                    </i-select>
+                </i-col>
+                <i-col span="3">
+                    <i-select v-model="q.storeId" placeholder="门店" filterable label-in-value>
+                        <i-option v-for="store in stores" :value="store.id"
+                                  :key="store.id">{{store.storeName}}
+                        </i-option>
+                    </i-select>
+                </i-col>
+
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group" style="width: 100%;margin-top: 8px;">
+                <i-col style="display: inline-grid;">
+                    <Upload :show-upload-list="false" :on-success="uploadExcelSuccess" :on-error="uploadExcelError" :on-format-error="uploadExcelFormatError"
+                            :format="['xls','xlsx']"
+                            action="../stockchange/upload" :before-upload="beforeUpload"  :data="uploadData" >
+                        <i-button type="ghost" icon="ios-cloud-upload-outline">导入</i-button>
+                    </Upload>
+                </i-col>
+                <a href="../statics/file/stock_change.xlsx">出入库单导入模板下载</a>
+            </div>
+            <div class="buttons-group">
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+
+                <i-button type="primary" @click="audit('1')"><i class="fa fa-pencil-square-o"></i>&nbsp;审核通过</i-button>
+                <i-button type="error" @click="audit('2')"><i class="fa fa-pencil-square-o"></i>&nbsp;审核拒绝</i-button>
+
+            </div>
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="stockChange" :rules="ruleValidate" :label-width="80">
+            <Form-item label="单号" prop="stockChangeId">
+                <i-input v-model="stockChange.id" placeholder="单号"/>
+            </Form-item>
+            <Form-item label="出,入库类型" prop="type">
+                <i-select v-model="stockChange.type" placeholder="出、入库类型,0:普通入库 1:调拨入库 2:销售出库 3:普通出库 4:调拨出库" filterable label-in-value>
+                    <i-option v-for="stockChangeType in stockChangeTypes" :value="stockChangeType.value"
+                              :key="stockChangeType.id">{{stockChangeType.name}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="出,入库时间" prop="time">
+                <i-input v-model="stockChange.time" placeholder="出、入库时间" type="datetime-local"/>
+            </Form-item>
+
+            <Form-item label="商户" prop="merchSn">
+                <i-select v-model="stockChange.merchSn" filterable placeholder="商户" @on-change="changeMerch" label-in-value>
+                    <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="第三方商户" prop="thirdMerchSn">
+                <i-select v-model="stockChange.thirdMerchSn" filterable placeholder="第三方商户" @on-change="changeThirdMerchantBiz" label-in-value>
+                    <i-option v-for="thirdMerchant in thirdMerchantBizList" :value="thirdMerchant.thirdPartyMerchCode"
+                              :key="thirdMerchant.thirdPartyMerchCode">{{thirdMerchant.thirdPartyMerchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="门店" prop="storeId">
+                <i-select v-model="stockChange.storeId" filterable placeholder="门店" label-in-value>
+                    <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="审核状态" prop="audit">
+                <i-select v-model="stockChange.audit" placeholder="审核状态" filterable label-in-value >
+                    <i-option v-for="stockChangeAudit in stockChangeAudits" :value="stockChangeAudit.value"
+                              :key="stockChangeAudit.id">{{stockChangeAudit.name}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input v-model="stockChange.remark" placeholder="备注"/>
+            </Form-item>
+
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+	</Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/stockchange.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 106 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/stockchangerecord.html

@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>海控出入库单记录</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="5">
+                    <i-select v-model="q.storeId" placeholder="门店编号" filterable label-in-value>
+                        <i-option v-for="store in stores" :value="store.id"
+                                  :key="store.id">{{store.storeName}}
+                        </i-option>
+                    </i-select>
+                </i-col>
+                <i-col span="3">
+                    <i-input v-model="q.parentId" @on-enter="query" placeholder="主体单号"/>
+                </i-col>
+                <i-col span="3">
+                    <i-input v-model="q.sku" @on-enter="query" placeholder="sku"/>
+                </i-col>
+                <i-col span="3">
+                    <i-select v-model="q.type" placeholder="出入库类型"
+                              label-in-value>
+                        <i-option v-for="macro in macros" :value="macro.value" :key="macro.id">{{macro.name}}
+                        </i-option>
+                    </i-select>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group" style="width: 100%;margin-top: 8px;">
+                <i-col style="display: inline-grid;">
+                    <Upload :show-upload-list="false" :on-success="uploadExcelSuccess" :on-error="uploadExcelError" :on-format-error="uploadExcelFormatError"
+                            :format="['xls','xlsx']"
+                            action="../stockchangerecord/upload" :before-upload="beforeUpload"  :data="uploadData" >
+                        <i-button type="ghost" icon="ios-cloud-upload-outline">导入</i-button>
+                    </Upload>
+                </i-col>
+                <a href="../statics/file/stock_change_record.xlsx">出入库单导入模板下载</a>
+            </div>
+            <div class="buttons-group">
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+            </div>
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="stockChangeRecord" :rules="ruleValidate" :label-width="80">
+            <Form-item label="商户" prop="merchSn">
+                <i-select v-model="stockChangeRecord.merchSn" filterable placeholder="商户" @on-change="changeMerch" label-in-value>
+                    <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="第三方商户" prop="thirdMerchSn">
+                <i-select v-model="stockChangeRecord.thirdMerchSn" filterable placeholder="第三方商户" @on-change="changeThirdMerchantBiz" label-in-value>
+                    <i-option v-for="thirdMerchant in thirdMerchantBizList" :value="thirdMerchant.thirdPartyMerchCode"
+                              :key="thirdMerchant.thirdPartyMerchCode">{{thirdMerchant.thirdPartyMerchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="门店id" prop="storeId">
+                <i-select v-model="stockChangeRecord.storeId" filterable placeholder="活动门店" label-in-value>
+                    <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="sku" prop="sku">
+                <i-input v-model="stockChangeRecord.sku" placeholder="sku"/>
+            </Form-item>
+            <Form-item label="类型" prop="type">
+                <i-select v-model="stockChangeRecord.type" placeholder="记录类型,0:出库 1:入库">
+                    <i-option value="0">出库</i-option>
+                    <i-option value="1">入库</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="数量" prop="number">
+                <i-input v-model="stockChangeRecord.number" placeholder="出库或入库数量"/>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input v-model="stockChangeRecord.remark" placeholder="备注"/>
+            </Form-item>
+<!--            <Form-item label="创建时间" prop="createTime">-->
+<!--                <i-input v-model="stockChangeRecord.createTime" placeholder=""/>-->
+<!--            </Form-item>-->
+<!--            <Form-item label="修改时间" prop="modifyTime">-->
+<!--                <i-input v-model="stockChangeRecord.modifyTime" placeholder=""/>-->
+<!--            </Form-item>-->
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+	</Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/stockchangerecord.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 131 - 122
kmall-admin/src/main/webapp/WEB-INF/page/sys/main.html

@@ -17,22 +17,8 @@
                     <i class="fa fa-shopping-bag"></i>
                 </div>
                 <a class="small-box-footer"></a>
-<!--                <a onclick="vm.toOrderByShipStatus()" class="small-box-footer">详情 <i-->
-<!--                        class="fa fa-arrow-circle-right"></i></a>-->
-            </div>
-        </div>
-        <div class="col-md-3 col-sm-6 col-xs-12">
-            <div class="small-box bg-yellow">
-                <div class="inner">
-                    <h3>{{dfOrderSum}}</h3>
-                    <p>待发货</p>
-                </div>
-                <div class="icon">
-                    <i class="fa fa-shopping-bag"></i>
-                </div>
-                <a class="small-box-footer"></a>
-<!--                <a onclick="vm.toOrderByShipStatus(0)" class="small-box-footer">详情 <i-->
-<!--                        class="fa fa-arrow-circle-right"></i></a>-->
+                <a onclick="vm.toOrderByShipStatus()" class="small-box-footer">详情 <i
+                        class="fa fa-arrow-circle-right"></i></a>
             </div>
         </div>
         <div class="col-md-3 col-sm-6 col-xs-12">
@@ -45,22 +31,8 @@
                     <i class="fa fa-shopping-bag"></i>
                 </div>
                 <a class="small-box-footer"></a>
-<!--                <a onclick="vm.toOrderByShipStatus(1)" class="small-box-footer">详情 <i-->
-<!--                        class="fa fa-arrow-circle-right"></i></a>-->
-            </div>
-        </div>
-        <div class="col-md-3 col-sm-6 col-xs-12">
-            <div class="small-box bg-light-blue">
-                <div class="inner">
-                    <h3>{{yfkOrderSum}}</h3>
-                    <p>待付款</p>
-                </div>
-                <div class="icon">
-                    <i class="fa fa-shopping-bag"></i>
-                </div>
-                <a class="small-box-footer"></a>
-<!--                <a onclick="vm.toOrderByPayStatus(0)" class="small-box-footer">详情 <i-->
-<!--                        class="fa fa-arrow-circle-right"></i></a>-->
+                <a onclick="vm.toOrderByShipStatus(0)" class="small-box-footer">详情 <i
+                        class="fa fa-arrow-circle-right"></i></a>
             </div>
         </div>
         <div class="col-md-3 col-sm-6 col-xs-12">
@@ -73,24 +45,53 @@
                     <i class="fa fa-shopping-bag"></i>
                 </div>
                 <a class="small-box-footer"></a>
-<!--                <a onclick="vm.toOrderByRefundStatus(1)" class="small-box-footer">详情 <i-->
-<!--                        class="fa fa-arrow-circle-right"></i></a>-->
+                <a onclick="vm.toOrderByShipStatus(1)" class="small-box-footer">详情 <i
+                        class="fa fa-arrow-circle-right"></i></a>
             </div>
         </div>
         <div class="col-md-3 col-sm-6 col-xs-12">
-            <div class="small-box bg-aqua">
+            <div class="small-box bg-yellow">
                 <div class="inner">
-                    <h3>{{ywcOrderSum}}</h3>
-                    <p>已完成</p>
+                    <h3>{{dfOrderSum}}</h3>
+                    <p>已付款</p>
                 </div>
                 <div class="icon">
                     <i class="fa fa-shopping-bag"></i>
                 </div>
                 <a class="small-box-footer"></a>
-<!--                <a onclick="vm.toOrderByOrderStatus(402)" class="small-box-footer">详情 <i-->
-<!--                        class="fa fa-arrow-circle-right"></i></a>-->
+                <a onclick="vm.toOrderByShipStatus(2)" class="small-box-footer">详情 <i
+                        class="fa fa-arrow-circle-right"></i></a>
             </div>
         </div>
+
+<!--        <div class="col-md-3 col-sm-6 col-xs-12">-->
+<!--            <div class="small-box bg-light-blue">-->
+<!--                <div class="inner">-->
+<!--                    <h3>{{yfkOrderSum}}</h3>-->
+<!--                    <p>待付款</p>-->
+<!--                </div>-->
+<!--                <div class="icon">-->
+<!--                    <i class="fa fa-shopping-bag"></i>-->
+<!--                </div>-->
+<!--                <a class="small-box-footer"></a>-->
+<!--                <a onclick="vm.toOrderByPayStatus(0)" class="small-box-footer">详情 <i-->
+<!--                        class="fa fa-arrow-circle-right"></i></a>-->
+<!--            </div>-->
+<!--        </div>-->
+<!--        <div class="col-md-3 col-sm-6 col-xs-12">-->
+<!--            <div class="small-box bg-aqua">-->
+<!--                <div class="inner">-->
+<!--                    <h3>{{ywcOrderSum}}</h3>-->
+<!--                    <p>已完成</p>-->
+<!--                </div>-->
+<!--                <div class="icon">-->
+<!--                    <i class="fa fa-shopping-bag"></i>-->
+<!--                </div>-->
+<!--                <a class="small-box-footer"></a>-->
+<!--                <a onclick="vm.toOrderByOrderStatus(402)" class="small-box-footer">详情 <i-->
+<!--                        class="fa fa-arrow-circle-right"></i></a>-->
+<!--            </div>-->
+<!--        </div>-->
         <div class="col-md-3 col-sm-6 col-xs-12">
             <div class="small-box bg-red">
                 <div class="inner">
@@ -101,7 +102,7 @@
                     <i class="fa fa-user-md"></i>
                 </div>
                 <a class="small-box-footer"></a>
-<!--                <a onclick="vm.toUser()" class="small-box-footer">详情 <i class="fa fa-arrow-circle-right"></i></a>-->
+                <a onclick="vm.toUser()" class="small-box-footer">详情 <i class="fa fa-arrow-circle-right"></i></a>
             </div>
         </div>
         <div class="col-md-3 col-sm-6 col-xs-12">
@@ -114,11 +115,11 @@
                     <i class="fa fa-ship"></i>
                 </div>
                 <a class="small-box-footer"></a>
-<!--                <a onclick="vm.toGoods()" class="small-box-footer">详情 <i class="fa fa-arrow-circle-right"></i></a>-->
+                <a onclick="vm.toGoods()" class="small-box-footer">详情 <i class="fa fa-arrow-circle-right"></i></a>
             </div>
         </div>
     </div>
-    <table class="table table-hover table-responsive table-bordered">
+    <!--<table class="table table-hover table-responsive table-bordered">
         <tr>
             <th colspan="5">会员购买率:<span style="color: red;">{{hygml}}%</span>(会员购买率=已付款订单会员数÷会员总数)</th>
         </tr>
@@ -152,7 +153,7 @@
             <td>{{mhydds}}</td>
             <td>{{mhygws}}</td>
         </tr>
-    </table>
+    </table>-->
 <!--    <table class="table table-hover table-responsive table-bordered">-->
 <!--        <tr>-->
 <!--            <th>总点击数:{{hitCount}}; 每千点击订单数:{{average1000}}; 每千点击购物额:{{averageSales1000}}</th>-->
@@ -164,14 +165,15 @@
     var vm = new Vue({
         el: '#rrapp',
         data: {
-            orderSum: 0,
-            dfOrderSum: 0,//待发货
+            orderSum: 0,//所有订单
+            dfOrderSum: 0,//已付款  原是待发货   都是指的同一个字段(已付款,待发货)
             yfOrderSum: 0,//已发货
             yfkOrderSum: 0,//待付款
             ywcOrderSum: 0,//已完成
-            thcOrderSum: 0,//退款
+            thcOrderSum: 0,//退款订单
             userSum: 0,//消费记录总数
             goodsSum: 0,//所有商品数
+
             yfkOrderUserSum: 0,//已付款订单会员数
             oderUserSum: 0,//有订单会员数
             todayUserOrder: 0,//今日订单数
@@ -191,35 +193,40 @@
                     openWindow({
                         top: true,
                         type: 2,
-                        title: '订单',
-                        content: '../shop/order.html'
+                        title: '所有订单',
+                        content: '../shop/offilineOrderList.html'
                     });
                     return;
                 }
-                let url = '../shop/order.html?shippingStatus=' + shippingStatus;
-
-                if (shippingStatus == 0) {//待发货
-                    url += '&orderStatus=201&payStatus=2';
-                    if (vm.dfOrderSum == 0) {
+                let url = '../shop/offilineOrderList.html?orderType=1';
+                let title='';
+                if (shippingStatus == 0) {//已发货
+                    if (vm.yfOrderSum == 0) {
                         iview.Message.error('没有数据!');
                         return;
                     }
-                } else if (shippingStatus == 1) {//已发货
-                    if (vm.yfOrderSum == 0) {
+                    url+="&orderStatus=300"
+                    title="已发货"
+                } else if (shippingStatus == 1) {//退款订单
+                    if (vm.thcOrderSum == 0) {
                         iview.Message.error('没有数据!');
                         return;
                     }
-                } else if (shippingStatus == 4) {//退款
-                    if (vm.thcOrderSum == 0) {
+                    url+="&orderStatus=401"
+                    title="退款订单"
+                } else if (shippingStatus == 2){//已付款
+                    if (vm.dfOrderSum == 0) {
                         iview.Message.error('没有数据!');
                         return;
                     }
+                    url+="&orderStatus=201"
+                    title="已付款"
                 }
 
                 openWindow({
                     top: true,
                     type: 2,
-                    title: '订单',
+                    title: title,
                     content: url
                 });
             },
@@ -264,84 +271,91 @@
                 openWindow({
                     top: true,
                     type: 2,
-                    title: '会员列表',
+                    title: '消费记录总数',
                     area: ['90%', '95%'],
-                    content: '../shop/shopuser.html'
+                    content: '../cashier/salerecord.html'
                 });
             },
             toGoods: function () {
                 openWindow({
                     top: true,
                     type: 2,
-                    title: '商品',
+                    title: '所有商品',
                     content: '../shop/goods.html'
                 });
             }
         },
         created: function () {
             let vue = this;
-            $.getJSON("../order/queryMainTotal", function (r) {
+            $.getJSON("../order/queryMainTotal", function (r) {//所有订单
                 vue.orderSum = r.sum;
             });
-            $.getJSON("../order/queryTotal?orderStatus=201&payStatus=2&isOnfiilineOrder=0", function (r) {
-                vue.dfOrderSum = r.sum;
-                if (r.sum > 0) {
-                    iview.Notice.info({
-                        title: '您有待发货订单',
-                        desc: '<a onclick="vm.toOrderByShipStatus(0)" class="small-box-footer">查看</a>',
-                        duration: 0
-                    });
-                    let iN = new iNotify({
-                        effect: 'flash',
-                        interval: 500,
-                        message: "待发订单",
-                        audio: {
-                            file: ['../statics/audio/dforder.mp3']
-                        },
-                        notification: {
-                            title: "通知!",
-                            body: '您有待发订单'
-                        }
-                    });
-                    iN.setTitle(true).player();
-                }
-            });
-            $.getJSON("../order/queryTotal?isOnfiilineOrder=0&shippingStatus=1", function (r) {
+            $.getJSON("../order/queryTotal?isOnfiilineOrder=1&orderStatus=300&orderType=1", function (r) {//已发货
                 vue.yfOrderSum = r.sum;
             });
-            $.getJSON("../order/queryTotal?isOnfiilineOrder=0&orderStatus=0", function (r) {
-                vue.yfkOrderSum = r.sum;
-            });
-            $.getJSON("../order/queryTotal?isOnfiilineOrder=0&orderStatus=402", function (r) {
-                vue.ywcOrderSum = r.sum;
-            });
-           $.getJSON("../orderrefund/queryMainTotal", function (r) {
-               console.log(r.sum)
+            // $.getJSON("../order/queryTotal?isOnfiilineOrder=1&orderStatus=0&orderType=1", function (r) {//待付款
+            //     vue.yfkOrderSum = r.sum;
+            // });
+            // $.getJSON("../order/queryTotal?isOnfiilineOrder=1&orderStatus=402", function (r) {//已完成
+            //     vue.ywcOrderSum = r.sum;
+            // });
+           $.getJSON("../order/queryTotal?isOnfiilineOrder=1&orderStatus=401&orderType=1", function (r) {//退款订单
                vue.thcOrderSum = r.sum;
            });
-            $.get("../orderrefund/queryTotal?isOnfflineOrder=0&refundStatus=1", function (r) {
-                vue.thcOrderSum = r.sum;
-                if (r.sum > 0) {
-                    iview.Notice.info({
-                        title: '您有退款申请订单',
-                        desc: '<a onclick="vm.toOrderByRefundStatus(1)" class="small-box-footer">查看</a>',
-                        duration: 0
-                    });
-                    let iN = new iNotify({
-                        effect: 'flash',
-                        interval: 500,
-                        message: "退款订单",
-                        audio: {
-                            file: ['../statics/audio/dforder.mp3']
-                        },
-                        notification: {
-                            title: "通知!",
-                            body: '您有退款申请订单'
-                        }
-                    });
-                    iN.setTitle(true).player();
-                }
+            $.getJSON("../mall2memberconsumptionrecords/queryTotal", function (r) {//消费记录总数
+                vue.userSum = r.userSum;
+            });
+            $.getJSON("../goods/queryTotal", function (r) {//所有商品数
+                vue.goodsSum = r.goodsSum;
             });
+            $.getJSON("../order/queryTotal?orderStatus=201&isOnfiilineOrder=1&orderType=1", function (r) {//已付款
+                vue.dfOrderSum = r.sum;
+                // if (r.sum > 0) {
+                //     iview.Notice.info({
+                //         title: '您有待发货订单',
+                //         desc: '<a onclick="vm.toOrderByShipStatus(0)" class="small-box-footer">查看</a>',
+                //         duration: 0
+                //     });
+                //     let iN = new iNotify({
+                //         effect: 'flash',
+                //         interval: 500,
+                //         message: "待发订单",
+                //         audio: {
+                //             file: ['../statics/audio/dforder.mp3']
+                //         },
+                //         notification: {
+                //             title: "通知!",
+                //             body: '您有待发订单'
+                //         }
+                //     });
+                //     iN.setTitle(true).player();
+                // }
+            });
+
+            // $.get("../orderrefund/queryTotal?isOnfflineOrder=1&refundStatus=1", function (r) {
+            //     // vue.thcOrderSum = r.sum;
+            //     if (r.sum > 0) {
+            //         iview.Notice.info({
+            //             title: '您有退款申请订单',
+            //             desc: '<a onclick="vm.toOrderByRefundStatus(1)" class="small-box-footer">查看</a>',
+            //             duration: 0
+            //         });
+            //         let iN = new iNotify({
+            //             effect: 'flash',
+            //             interval: 500,
+            //             message: "退款订单",
+            //             audio: {
+            //                 file: ['../statics/audio/dforder.mp3']
+            //             },
+            //             notification: {
+            //                 title: "通知!",
+            //                 body: '您有退款申请订单'
+            //             }
+            //         });
+            //         iN.setTitle(true).player();
+            //     }
+            // });
+
             $.getJSON("../order/getUserOrderInfo?type=yfkOrderUserSum", function (r) {
                 vue.yfkOrderUserSum = r.result;
             });
@@ -364,12 +378,7 @@
                 vue.hitCount = r.hitCount;
             });
 
-            $.getJSON("../mall2memberconsumptionrecords/queryTotal", function (r) {
-                vue.userSum = r.userSum;
-            });
-            $.getJSON("../goods/queryTotal", function (r) {
-                vue.goodsSum = r.goodsSum;
-            });
+
         },
         updated: function () {
             let vue = this;

+ 2 - 2
kmall-admin/src/main/webapp/WEB-INF/page/vip/mall2pointsrules.html

@@ -40,8 +40,8 @@
 		<i-form ref="formValidate" :model="mall2PointsRules" :rules="ruleValidate" :label-width="80">
             <Form-item  label="积分类型" prop="pointsType" style="height: 30px;">
                 <i-select v-model="mall2PointsRules.pointsType" placeholder="积分类型" label-in-value>
-                    <i-option v-for="category in categories" :value="category.value"
-                              :key="category.value">{{category.name}}
+                    <i-option v-for="category in categoryObj" :value="category.id"
+                              :key="category.id">{{category.name}}
                     </i-option>
                 </i-select>
             </Form-item>

+ 9 - 1
kmall-admin/src/main/webapp/js/mk/mkactivities.js

@@ -77,7 +77,15 @@ let vm = new Vue({
             vm.getInfo(mkaId)
 		},
 		saveOrUpdate: function (event) {
-            let url = vm.mkActivities.mkaId == null ? "../mkactivities/save" : "../mkactivities/update";
+			let mkaId = vm.mkActivities.mkaId;
+			let url = mkaId == null ? "../mkactivities/save" : "../mkactivities/update";
+
+			let priority = vm.mkActivities.priority;
+			if (mkaId == null && (priority == null || priority == '' || priority == 'undefined')) {
+            	alert("活动优先级不能为空!");
+            	return;
+			}
+
 			$.ajax({
 				type: "POST",
 			    url: url,

+ 3 - 1
kmall-admin/src/main/webapp/js/mk/mkactivityform.js

@@ -52,7 +52,7 @@ $(function () {
     $("#jqGrid").jqGrid("setFrozenColumns");
 
     var marketing =
-        {'lscx': '临时促销',/*'yhq': '优惠券',*/'rchd': '日常活动','mysy': '买N送一',/*'mj': '满减', 'mz': '满赠','dz': '打折','zhjsp': '组合价商品',*/'drjbj':'第二件半价'};
+        {'lscx': '临时促销','jfdk': '积分抵扣'/*'yhq': '优惠券','rchd': '日常活动','mysy': '买N送一',/*'mj': '满减', 'mz': '满赠','dz': '打折','zhjsp': '组合价商品','drjbj':'第二件半价'*/};
 
 
     let mkCode = getQueryString("mkCode");
@@ -93,6 +93,8 @@ $(function () {
                         mkaTopicName = marketing.zhjsp;
                     else if(value === 'drjbj')
                         mkaTopicName = marketing.drjbj;
+                    else if(value === 'jfdk')
+                        mkaTopicName = marketing.jfdk;
                     return mkaTopicName == null? value : mkaTopicName;
                 }},
             {label: '商户名称', name: 'merchName', width: 200, align: 'center'},

+ 1 - 1
kmall-admin/src/main/webapp/js/sale/pickupcode.js

@@ -449,7 +449,7 @@ function getPrintContentOrder(ticket) {
 	content += "购买跨境商品须知:"
 	content += "</div>";
 	content += "<div style=\"width: 100%;\">";
-	content += "1、凡购买跨境商品均不提供发票;<br> 2、单笔限购5000元,年交易限额2.6万元; <br> 3、所有订单经海关放行后方可提货; <br> 4、凭小票领取您的订单商品; <br> 5、非产品质量问题,跨境商品不支持无理由退换货,请及时检查。 "
+	content += "1、凡购买跨境商品均不提供发票;<br> 2、单笔限购5000元,年交易限额2.6万元; <br> 3、所有订单在海关放行后进行发货; <br> 4、凭小票领取您的订单商品; <br> 5、非产品质量问题,跨境商品不支持无理由退换货,请及时检查。 "
 	content += "</div>";
 	content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
 	content += "<div style=\"width: 100%;\">";

+ 216 - 58
kmall-admin/src/main/webapp/js/sale/sale.js

@@ -20,7 +20,7 @@ window.onbeforeunload = function(){
 function debounce(fn,delay){
     var timer=null
     return function(){
-        console.log(timer);
+        // console.log(timer);
         if(timer){
             clearTimeout(timer)
         }
@@ -33,7 +33,7 @@ function calculateGoodsPrice(r){
     var rMap = r.map;
     var barCode = r.goodsDetails.prodBarcode;
     var brand = r.goodsDetails.brand;
-    console.log(rMap);
+    // console.log(rMap);
 
     /*if(rMap.yhq){
         for(var i in rMap.yhq){
@@ -258,7 +258,7 @@ function calculateGoodsByMysy(goodsDetails,type){
                 // goodsDetails.activity = "买"+buyNum+"送1";
                 // 清除该商品买一送一条件
                 vm.boughtNum.delete(goodsDetails.prodBarcode);
-                console.log(vm.boughtNum);
+                // console.log(vm.boughtNum);
             }else{
                 // 如果不相等,已经购买数量+1
                 vm.boughtNum.set(goodsDetails.prodBarcode , boughtNum+1);
@@ -484,7 +484,7 @@ function calculateGoodsByZhjsp(r){
             }
         });
     }
-    console.log(vm.compareCombinationPrice);
+    // console.log(vm.compareCombinationPrice);
 }
 
 const delay = (function () {
@@ -604,7 +604,7 @@ let vm = new Vue({
         // 会员手机
         memberPhone: '',
         // 订单抵扣积分
-        deductionScore: '',
+        deductionScore: '',
         // 会员可用积分
         memberCurrentAvailableScore: 0,
         // 会员等级名称
@@ -622,7 +622,14 @@ let vm = new Vue({
         // 是否点击了加号或减号和操作新扫描商品的标识
         clickFlag: false,
         // 是否点击了计算活动价格
-        calActivityFlag: false
+        calActivityFlag: false,
+        // 是否适用积分进行抵扣
+        switch1: true,
+        // 旧密码
+        oldPassword: '',
+        // 新密码
+        newPassword: '',
+        newPassword2: ''
     },
     watch: {
         prodBarcode (){
@@ -684,7 +691,7 @@ let vm = new Vue({
         },
         queryInveResponse:function(){
             $.get("../order/queryInveResponse/"+vm.orderSn1, function(r){
-                console.log(r.resultMessage);
+                // console.log(r.resultMessage);
                 let resultString = "";
                 if(r.resultMessage != null && r.resultMessage.length > 0){
                     for(let i = 0 ; i < r.resultMessage.length; i ++){
@@ -697,10 +704,14 @@ let vm = new Vue({
         query: function () {
             vm.storeId = sessionStorage.getItem("storeId");
             var thisGoods = {};
+            // 挂起后的新订单默认开启
+            if (vm.pendingOrderMap != null || vm.pendingOrderMap.size > 0) {
+                vm.switch1 = true;
+            }
             var overflowLi = this.$refs.overflowLi;
-            console.log("vm.$refs.saomiao.value===>" + vm.$refs.saomiao.value);
+            // console.log("vm.$refs.saomiao.value===>" + vm.$refs.saomiao.value);
             let scanSellVolume = calScanSellVolume(vm.$refs.saomiao.value);
-            console.log("scanSellVolume===>" + scanSellVolume);
+            // console.log("scanSellVolume===>" + scanSellVolume);
             $.get("../goods/details/"+vm.prodBarcode+"/"+vm.storeId+"/"+vm.prodBarcode+"/"+scanSellVolume, function (r) {
                 if (r.code == 0) {
                     if(r.goodsDetails.length>1) {
@@ -735,7 +746,7 @@ let vm = new Vue({
                             handle(r.goodsDetails,"add");
                             vm.openSku = false;
                             var data = Object.assign({}, JSON.parse(JSON.stringify(r.goodsDetails)));
-                            console.log("商品详情===>" + JSON.stringify(data));
+                            // console.log("商品详情===>" + JSON.stringify(data));
                             vm.calGoodsList.push(data);
                             //此时必须异步执行滚动条滑动至底部
                             setTimeout(()=>{
@@ -751,9 +762,9 @@ let vm = new Vue({
         saveOld:function(){
             vm.storeId = sessionStorage.getItem("storeId");
             var overflowLi = this.$refs.overflowLi;
-            console.log("vm.$refs.saomiao.value===>" + vm.$refs.saomiao.value);
+            // console.log("vm.$refs.saomiao.value===>" + vm.$refs.saomiao.value);
             let scanSellVolume = calScanSellVolume(vm.$refs.saomiao.value);
-            console.log("scanSellVolume===>" + scanSellVolume);
+            // console.log("scanSellVolume===>" + scanSellVolume);
                 $.get("../goods/detailsOld/"+vm.prodBarcode+"/"+vm.storeId+"/"+scanSellVolume, function (r) {
                     if (r.code == 0) {
                         r.goodsDetails.sellVolume = 1;
@@ -763,7 +774,7 @@ let vm = new Vue({
                         handle(r.goodsDetails,"add");
                         vm.openSku = false;
                         var data = Object.assign({}, JSON.parse(JSON.stringify(r.goodsDetails)));
-                        console.log("商品详情=1=>" + JSON.stringify(data));
+                        // console.log("商品详情=1=>" + JSON.stringify(data));
                         vm.calGoodsList.push(data);
                         //此时必须异步执行滚动条滑动至底部
                         setTimeout(()=>{
@@ -838,7 +849,7 @@ let vm = new Vue({
 
         },
         selectItem:function(value) {
-            console.log(value);
+            // console.log(value);
         },
         deleteItem:function(value){
             vm.calActivityFlag = false;
@@ -923,7 +934,7 @@ let vm = new Vue({
                 alert("购物车中没有商品");
                 return;
             }
-            console.log(vm.pendingOrderMap.size);
+            // console.log(vm.pendingOrderMap.size);
             if(vm.pendingOrderMap.size >= 3){
                 alert("订单挂起最多支持3单");
                 return;
@@ -943,6 +954,9 @@ let vm = new Vue({
             vm.levelName = '';
             vm.deductionScore = '';
             vm.memberCurrentAvailableScore = '';
+            vm.userInfo.customPhone = '';
+            vm.memberCode = '';
+            vm.switch1 = true;
             vm.clickFlag = true;
             vm.calActivityFlag = false;
             vm.customClearData();
@@ -955,7 +969,10 @@ let vm = new Vue({
             vm.levelName = '';
             vm.deductionScore = '';
             vm.memberCurrentAvailableScore = '';
+            vm.memberCode = '';
+            vm.userInfo.customPhone = '';
             vm.clickFlag = true;
+            vm.switch1 = true;
             vm.calActivityFlag = false;
             $('#pendignOrderModal').modal('show');
         },
@@ -969,7 +986,7 @@ let vm = new Vue({
                 return ;
             }
             var pendingObject = vm.pendingOrderMap.get(key);
-            console.log(pendingObject);
+            // console.log(pendingObject);
             vm.goodsList = pendingObject.goodsList;
             vm.totalPrice = pendingObject.totalPrice;
             vm.totalCount = pendingObject.totalCount;
@@ -979,6 +996,9 @@ let vm = new Vue({
             vm.pendingOrderMap.delete(key);
 
             vm.clickFlag = true;
+            vm.memberCode = '';
+            vm.userInfo.customPhone = '';
+            vm.switch1 = true;
             vm.calActivityFlag = false;
             removeByValue(vm.pendingOrderKeys,key);
             $('#pendignOrderModal').modal('hide')
@@ -990,7 +1010,7 @@ let vm = new Vue({
                 return;
             }
 
-            console.log("vm.clickFlag==>" + vm.clickFlag);
+            // console.log("vm.clickFlag==>" + vm.clickFlag);
             if (vm.clickFlag && !vm.calActivityFlag) {
                 // 提示点击
                 alert("请先计算活动优惠价!");
@@ -1005,7 +1025,6 @@ let vm = new Vue({
                 customPhone = '';
             }
             vm.$refs.customPhone.value = customPhone;
-            vm.$refs.couponBarCode.value = "";
             if(vm.$refs.couponSn)
                 vm.$refs.couponSn.value = "";
             this.userInfo.couponSn = "";
@@ -1020,9 +1039,6 @@ let vm = new Vue({
                 alert("请选择商品");
                 return;
             }
-            vm.calActivityFlag = true;
-
-            vm.clickFlag = false;
             $("#calculateOrderPriceDialog").modal('show');
 
             this.couponBarCodeChangeFocus();
@@ -1224,7 +1240,21 @@ let vm = new Vue({
                     vm.currentOrderNo = r.resultObj.orderEntity.id;
                     vm.pickUpCode = pickUpCode;
                     vm.tax = r.resultObj.tax;
-                    vm.response = r.resultObj.response;
+                    try {
+                        //转换为json对象,
+                        //如果转换出现异常,说明是字符串也就是海关回执报文  没有说明是json对象  页面显示为空
+                        console.log(r.resultObj.response)
+                        var obj = JSON.parse(r.resultObj.response);
+                        console.log(obj)
+                        if (typeof obj === 'object' && obj) {
+                            vm.response='';
+                        } else {
+
+                        }
+                    } catch (error) {
+                        //转换异常,返回说明是字符串---海关回执报文
+                        vm.response=r.resultObj.response;
+                    }
                     if(vm.orderProcessRecord.eleOrderStartTime){
                         vm.orderProcessRecord.eleOrderStartTime = parsedate(vm.orderProcessRecord.eleOrderStartTime);
                     }
@@ -1245,6 +1275,13 @@ let vm = new Vue({
                 }
             });
         },
+        resendorderinfo: function () {
+            confirm('确认重发订单信息到免税mall吗?', function () {
+                $.get("../order/resendOrderHkMall/"+vm.orderEntity.orderSn+"/vmcshop", function (r) {
+                    alert(r.msg);
+                });
+            })
+        },
         resendNotice:function(){
             confirm('确认重发重置吗?', function () {
                 $.get("../order/resendOrderToCCNET/"+vm.orderEntity.orderSn+"/notice", function (r) {
@@ -1300,9 +1337,9 @@ let vm = new Vue({
                     success: function (r) {
                         if (r.ticket != null) {
                             // printArea(r.ticket);
-                            console.log("核销打印前,订单号: " + vm.currentOrderNo);
+                            // console.log("核销打印前,订单号: " + vm.currentOrderNo);
                             var content = getPrintContentOrder(r.ticket, printArea);
-                            console.log("核销打印后,小票码: " + vm.pickUpCode + ",订单号: " + r.ticket.ticketHead.orderId);
+                            // console.log("核销打印后,小票码: " + vm.pickUpCode + ",订单号: " + r.ticket.ticketHead.orderId);
 
                         }else{
                             alert("打印小票失败");
@@ -1396,7 +1433,121 @@ let vm = new Vue({
                     this.$refs.payCode.focus();
                 }, 200);
             })
-        }
+        },
+        /**
+         * 2021/12/27
+         * 实名认证
+         */
+        idCardVerification:function (){
+            var custimName=this.$refs.customName.value;
+            var customIDCard=this.$refs.customIDCard.value;
+            if (custimName==''){
+                alert("请输入姓名");
+                return;
+            }
+            if (customIDCard==''){
+                alert("请输入身份证");
+                return;
+            }
+
+            let memberCode = vm.memberCode;
+            if (memberCode === null || memberCode === '' || memberCode === 'undefined') {
+                vm.levelName = '无';
+                vm.memberCurrentAvailableScore = '无';
+                vm.deductionScore = '无';
+            }
+
+            $.ajax({
+                type: "POST",
+                url: "../api/index/idCardVerification",
+                contentType: "application/json",
+                data: JSON.stringify({'idNo':customIDCard,'userName':custimName}),
+                success: function (r) {
+                    if (r.errno==0){
+                        //实名认证成功则调用去付款方法
+                        $('#myModal').modal('hide');
+                        vm.submitCustomInfo();
+                    }else{
+                        alert(r.errmsg)
+                        $('#myModal').modal('show');
+                        return;
+                    }
+
+
+                }
+            });
+
+        },
+        updatePasswordOpen : function () {
+            vm.oldPassword = '';
+            vm.newPassword = '';
+            vm.newPassword2 = '';
+            $("#updatePasswordDialog").modal('show');
+        },
+        closeUpdatePasswordDialog : function () {
+            vm.oldPassword = '';
+            vm.newPassword = '';
+            vm.newPassword2 = '';
+            $("#updatePasswordDialog").modal('hide');
+        },
+        updatePassword: function () {
+
+            let oldPassword = vm.oldPassword;
+            let newPassword = vm.newPassword;
+            // let newPassword2 = vm.newPassword2;
+
+            if (oldPassword === 'null' || oldPassword === null || oldPassword === '' || oldPassword === 'undefined') {
+                alert("原密码不能为空!");
+                return;
+            }
+
+            if (newPassword === 'null' || newPassword === null || newPassword === '' || newPassword === 'undefined') {
+                alert("新密码不能为空!");
+                return;
+            }
+            // if (newPassword2 === 'null' || newPassword2 === null || newPassword2 === '' || newPassword2 === 'undefined') {
+            //     alert("第二次输入的新密码不能为空!");
+            //     return;
+            // }
+
+            // if (newPassword2 !== newPassword) {
+            //     alert("新密码不一致!");
+            //     return;
+            // }
+
+            // if (newPassword === oldPassword && oldPassword === newPassword2) {
+            //     alert("输入的密码相同!");
+            //     return;
+            // }
+            if (newPassword === oldPassword) {
+                alert("输入的密码相同!");
+                return;
+            }
+
+            if (newPassword.length < 6) {
+                alert("新密码必须大于6位!");
+                return;
+            }
+
+            var data = "password=" + oldPassword + "&newPassword=" + newPassword;
+            $.ajax({
+                type: "POST",
+                url: "../sys/user/password",
+                data: data,
+                dataType: "json",
+                success: function (result) {
+                    if (result.code == 0) {
+                        alert("修改成功!", function () {
+                            location.reload();
+                        });
+                    } else {
+                        alert(result.msg);
+                    }
+                }
+            });
+        },
+
+
     }
 });
 
@@ -1435,7 +1586,7 @@ function getPrintContent(ticket) {
     content += "打印日期:" + ticket.time;
     content += "</div>";
     content += "<div style=\"width: 100%;margin:5px 0px;font-size: 13px;\">";
-    content += "该取货单号只有当天有效!"
+    content += "该小票只有当天有效!"
     content += "</div>";
     content += "<div style=\"width: 100%;margin:5px 0px;font-size: 13px;\">";
     content += "请妥善保管好小票,以免造成个人信息泄露!"
@@ -1603,7 +1754,7 @@ function parsedate(value){
 }
 
 function getPrintContentOrder(ticket, callback) {
-    var content = "<div style=\"width: 270px;font-family: 微软雅黑;font-size: 8px;\">";
+    var content = "<div style=\"width: 290px;font-family: 微软雅黑;font-size: 8px;\">";
     // 打印ogo
     content += "<div style=\"text-align: center;width: 100%;height: 260px;\">";
     content += "<img src='/statics/img/zmhk.png' style='width: 100%;height: 100%;' />";
@@ -1624,24 +1775,24 @@ function getPrintContentOrder(ticket, callback) {
     content += "<div style=\"width: 100%;\">";
     content += "交易时间:" + ticket.ticketHead.tradeTime;
     content += "</div>";
-    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">-------------------------------------------------------</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\"><hr style='border-top: 1px dashed black;'/></div>";
     //商品信息
     content += "<table style=\"width: 100%;\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
     content += "<tr>";
-    content += "<td style=\"width: 40%;text-align: left;font-size: 10px;font-weight: bold;\">商品名称</td>";
-    content += "<td style=\"width: 17%;text-align: right;font-size: 10px;font-weight: bold;\">单价</td>";
-    content += "<td style=\"width: 17%;text-align: right;font-size: 10px;font-weight: bold;\">优惠</td>";
-    content += "<td style=\"width: 17%;text-align: right;font-size: 10px;font-weight: bold;\">优惠后单价</td>";
+    content += "<td style=\"width: 30%;text-align: left;font-size: 10px;font-weight: bold;\">商品名称</td>";
+    content += "<td style=\"width: 12%;text-align: right;font-size: 10px;font-weight: bold;\">单价</td>";
+    content += "<td style=\"width: 12%;text-align: right;font-size: 10px;font-weight: bold;\">优惠</td>";
+    // content += "<td style=\"width: 22%;text-align: right;font-size: 10px;font-weight: bold;\">优惠后单价</td>";
     // content += "<td style=\"width: 16%;text-align: right;font-size: 10px;font-weight: bold;\">税费</td>";
-    content += "<td style=\"width: 15%;text-align: right;font-size: 10px;font-weight: bold;\">数量</td>";
-    content += "<td style=\"width: 18%;text-align: right;font-size: 10px;font-weight: bold;\">小计</td>";
+    content += "<td style=\"width: 12%;text-align: right;font-size: 10px;font-weight: bold;\">数量</td>";
+    content += "<td style=\"width: 12%;text-align: right;font-size: 10px;font-weight: bold;\">小计</td>";
     content += "</tr>";
     content += "</table>";
-    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">-------------------------------------------------------</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\"><hr style='border-top: 1px dashed black;'/></div>";
     content += "<table style=\"width: 100%;\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
     for (var i=0;i< ticket.goods.length;i++){
         content += "<tr>";
-        content += "<td style=\"width: 40%;text-align: left;font-size: 8px;padding-top: 8px;\">";
+        content += "<td style=\"width: 30%;text-align: left;font-size: 8px;padding-top: 8px;\">";
         content += "<table style=\"width: 100%;\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
         content += "<tr>";
         content += "<td style=\"text-align: left;font-size: 8px;vertical-align:top;\">#</td>";
@@ -1649,17 +1800,17 @@ function getPrintContentOrder(ticket, callback) {
         content += "</tr>";
         content += "</table>";
         content += "</td>";
-        content += "<td style=\"width: 17%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].uprice + "</td>";
-        content += "<td style=\"width: 17%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].discountPrice + "</td>";
-        content += "<td style=\"width: 17%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].afterDiscountPrice + "</td>";
+        content += "<td style=\"width: 12%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].uprice + "</td>";
+        content += "<td style=\"width: 12%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].discountPrice + "</td>";
+        // content += "<td style=\"width: 22%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].afterDiscountPrice + "</td>";
         // content += "<td style=\"width: 17%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].taxation + "</td>";
-        content += "<td style=\"width: 15%;text-align: center;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].num + "</td>";
-        content += "<td style=\"width: 18%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].subtotal + "</td>";
+        content += "<td style=\"width: 12%;text-align: center;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].num + "</td>";
+        content += "<td style=\"width: 12%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].subtotal + "</td>";
         content += "</tr>";
 
     }
     content += "</table>";
-    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\"><hr style='border-top: 1px dashed black;'/></div>";
     //收银信息
     content += "<div style=\"width: 100%;\">";
     content += "<span style=\"float: left;width: 50%;text-align: left;\">商品合计:</span>";
@@ -1687,10 +1838,10 @@ function getPrintContentOrder(ticket, callback) {
     content += "<span style=\"float: left;width: 50%;text-align: left;\">实收:</span>";
     content += "<span style=\"float: right;width: 50%;text-align: right;\">" + ticket.cashInfo.receipts + "元</span>";
     content += "</div>";
-    content += "<div style=\"width: 100%;\">";
-    content += "<span style=\"float: left;width: 50%;text-align: left;\">优惠:</span>";
-    content += "<span style=\"float: right;width: 50%;text-align: right;\">" + (new BigNumber(ticket.cashInfo.coupon).subtract(new BigNumber(ticket.cashInfo.scoreDeductionPrice))) + "元</span>";
-    content += "</div>";
+    // content += "<div style=\"width: 100%;\">";
+    // content += "<span style=\"float: left;width: 50%;text-align: left;\">优惠:</span>";
+    // content += "<span style=\"float: right;width: 50%;text-align: right;\">" + (new BigNumber(ticket.cashInfo.coupon).subtract(new BigNumber(ticket.cashInfo.scoreDeductionPrice))) + "元</span>";
+    // content += "</div>";
     // content += "<div style=\"width: 100%;\">";
     // content += "<span style=\"float: left;width: 50%;text-align: left;\">运费:</span>";
     // content += "<span style=\"float: right;width: 50%;text-align: right;\">" + ticket.cashInfo.freight + "元</span>";
@@ -1700,7 +1851,7 @@ function getPrintContentOrder(ticket, callback) {
     // 后期改成从系统中取
     content += "<span style=\"float: right;width: 50%;text-align: right;\">" + ticket.cashInfo.paymentMode + "</span>";
     content += "</div>";
-    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\"><hr style='border-top: 1px dashed black;'/></div>";
     //海关清单信息
     // content += "<div style=\"width: 100%;\">";
     // content += "订单号:" + ticket.cusListing.orderId;
@@ -1723,15 +1874,15 @@ function getPrintContentOrder(ticket, callback) {
     // content += "<div style=\"width: 100%;\">";
     // content += "交货地:" + ticket.cusListing.deliveryAddress;
     // content += "</div>";
-    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\"><hr style='border-top: 1px dashed black;'/></div>";
 
     content += "<div style=\"width: 100%;text-align: center;\">";
     content += "购买跨境商品须知:"
     content += "</div>";
     content += "<div style=\"width: 100%;\">";
-    content += "1、凡购买跨境商品均不提供发票;<br> 2、单笔限购5000元,年交易限额2.6万元; <br> 3、所有订单经海关放行后方可提货; <br> 4、凭小票领取您的订单商品; <br> 5、非产品质量问题,跨境商品不支持无理由退换货,请及时检查。 "
+    content += "1、凡购买跨境商品均不提供发票;<br> 2、单笔限购5000元,年交易限额2.6万元; <br> 3、所有订单在海关放行后进行发货; <br> 4、凭小票领取您的订单商品; <br> 5、非产品质量问题,跨境商品不支持无理由退换货,请及时检查。 "
     content += "</div>";
-    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\"><hr style='border-top: 1px dashed black;'/></div>";
     content += "<div style=\"width: 100%;\">";
     // content += ticket.ticketFoot.summary;
     content += "</div>";
@@ -1752,13 +1903,13 @@ function getPrintContentOrder(ticket, callback) {
     content += "请保管好收银小票。";
     content += "</div>";
     // 打印二维码
-    content += "<div style=\"text-align: center;width: 100%;height: 250px;\">";
+    content += "<div style=\"text-align: center;width: 100%;height: 290px;\">";
     content +=  `<img src='${ticket.ticketMailInfo.storeImgUrl}' style='width: 100%;height: 100%;' />`;
     content += "</div>";
     content += "<div style=\"width: 100%;text-align: center;\">";
     content += "关注公众号,获取更多优惠信息"
     content += "</div>";
-    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\"><hr style='border-top: 1px dashed black;'/></div>";
     content += "<div style=\"width: 100%;height: 50px;\"></div>";
 
     // var strategies = {
@@ -2071,7 +2222,7 @@ function toPayOrder(payCode){
                  'addrUser':addrUser,
                  'status':status,
                 };
-    console.log(JSON.stringify(param));
+    // console.log(JSON.stringify(param));
     vm.parCode = "";
     $.ajax({
         type: "POST",
@@ -2079,7 +2230,7 @@ function toPayOrder(payCode){
         contentType: "application/json",
         data: JSON.stringify(param),
         success: function (r) {
-            console.log(r);
+            // console.log(r);
             if (r.code == 0) {
                 if (r.resultObj != null) {
                     $(".form-group input[type=text]").each(function(){
@@ -2087,7 +2238,7 @@ function toPayOrder(payCode){
                     })
                     // 打印小票码小票
                     var content = getPrintContent(r.resultObj);
-                    console.log(content);
+                    // console.log(content);
                     printArea2(content);
                     vm.goodsList = [];
                     vm.customname = '' ;
@@ -2095,6 +2246,9 @@ function toPayOrder(payCode){
                     vm.levelName = '';
                     vm.deductionScore = '';
                     vm.memberCurrentAvailableScore = '';
+                    vm.userInfo.customPhone = '';
+                    vm.memberCode = "";
+                    vm.switch1 = true;
                     vm.clickFlag = false;
                     vm.customClearData();
 
@@ -2134,8 +2288,8 @@ function toRefund(){
 calScanSellVolume = function (prodBarcode) {
     let goodsList = vm.goodsList;
 
-    console.log("prodBarcode typeof===>" + typeof prodBarcode);
-    console.log("prodBarcode===>" + prodBarcode);
+    // console.log("prodBarcode typeof===>" + typeof prodBarcode);
+    // console.log("prodBarcode===>" + prodBarcode);
     if (goodsList === null || goodsList.length === 0) {
         return 2;
     }
@@ -2157,9 +2311,10 @@ calculateOrderPrice = function() {
     let param = {
         'storeId': sessionStorage.getItem("storeId"),
         'memberCode': vm.$refs.couponBarCode.value,
+        'useScore': vm.switch1,
         'goodsList' : vm.goodsList
     };
-    // console.log("请求参数===>" + JSON.stringify(param));
+    console.log("请求参数===>" + JSON.stringify(param));
 
     $.ajax({
         type: "POST",
@@ -2187,6 +2342,9 @@ calculateOrderPrice = function() {
                 vm.afterScore = r.data.afterScore;
                 vm.userInfo.customPhone = r.data.memberPhone;
                 vm.$refs.customPhone.value = r.data.memberPhone;
+                vm.calActivityFlag = true;
+
+                vm.clickFlag = false;
                 // console.log("memberPhone===>" + r.data.memberPhone);
                 // console.log("this.userInfo.customPhone===>" + vm.userInfo.customPhone);
                 // console.log("vm.$refs.customPhone.value===>" + vm.$refs.customPhone.value);

+ 4 - 0
kmall-admin/src/main/webapp/js/shop/mngchange.js

@@ -16,6 +16,10 @@ $(function () {
                         return '更新库存增加';
                     } else if (value == '4') {
                         return '更新库存减少';
+                    } else if (value == '5') {
+                        return '出库单';
+                    } else if (value == '6') {
+                        return '入库单';
                     }
                     return '-';
                 }

+ 11 - 3
kmall-admin/src/main/webapp/js/shop/offilineOrderList.js

@@ -620,13 +620,21 @@ let vm = new Vue({
             }
         },
         exportSaleReportExcel:function(){
+            var params = {};
+            params.billDate = vm.q.billDate;
+            params.storeName = vm.q.storeName;
+            if (params.billDate == null || params.billDate==''){
+                alert('请选择账单时间');
+                return
+            }
+            if (params.storeName == null || params.storeName==''){
+                alert('请输入门店名称');
+                return
+            }
             const msg = this.$Message.loading({
                 content: 'Loading...',
                 duration: 0
             });
-            var params = {};
-            params.billDate = vm.q.billDate;
-            params.storeName = vm.q.storeName;
             exportFile('#rrapp', '../exportExcel/exportSalesExcel', params);
             setTimeout(msg, 1000);
 

+ 324 - 0
kmall-admin/src/main/webapp/js/shop/stockchange.js

@@ -0,0 +1,324 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../stockchange/list',
+        datatype: "json",
+        colModel: [
+			{label: '单号', name: 'id', index: 'id', key: true, width: 80, align: 'center',formatter: function (value){
+				return "<a onClick='vm.stockChangeRecordByOrderId("+value+")' className='small-box-footer'>"+value+"</a>"
+
+			}},
+			{label: '类型', name: 'type', index: 'type', width: 80, align: 'center', formatter: function (value) {
+				if (value == '0') {
+					return '普通入库';
+				} else if (value == '1') {
+					return '调拨入库';
+				} else if (value == '2') {
+					return '销售出库';
+				} else if (value == '3') {
+					return '普通出库';
+				} else if (value == '4') {
+					return '调拨出库';
+				}
+				return '-';
+			}},
+			{label: '出入库时间', name: 'time', index: 'time', width: 80, align: 'center'},
+			{label: '商户编号', name: 'merchSn', index: 'merch_sn', width: 80, align: 'center'},
+			{label: '商户名称', name: 'merch', index: 'merch', width: 80, align: 'center'},
+			{label: '门店id', name: 'storeId', index: 'store_id', width: 80, align: 'center'},
+			{label: '门店名称', name: 'store', index: 'store', width: 80, align: 'center'},
+			{label: '商品名称', name: 'product', index: 'product', width: 80, align: 'center'},
+			{label: '第三方商户', name: 'thirdMerchSn', index: 'third_merch_sn', width: 80, align: 'center'},
+			{label: '审核状态', name: 'audit', index: 'audit', width: 80, align: 'center', formatter: function (value) {
+					if (value == '0') {
+						return '待审核';
+					} else if (value == '1') {
+						return '审核成功';
+					} else if (value == '2') {
+						return '审核拒绝';
+					}
+					return '-';
+			}},
+			{label: '第三方商户名称', name: 'thirdMerch', index: 'third_merch', width: 80, align: 'center'},
+			{label: '备注', name: 'remark', index: 'remark', width: 80, align: 'center'},
+			{label: '创建人', name: 'createBy', index: 'create_by', width: 80, align: 'center'},
+			{label: '创建时间', name: 'createTime', index: 'create_time', width: 80, align: 'center'},
+			{label: '修改人', name: 'modifyBy', index: 'modify_by', width: 80, align: 'center'},
+			{label: '修改时间', name: 'modifyTime', index: 'modify_time', width: 80, align: 'center'},
+			{label: '审核人', name: 'auditBy', index: 'audit_by', width: 80, align: 'center'},
+			{label: '审核时间', name: 'auditTime', index: 'audit_time', width: 80, align: 'center'},
+			{label: '规格', name: 'specification', index: 'specification', width: 80, align: 'center'},
+		],
+		viewrecords: true,
+        height: 550,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+let vm = new Vue({
+	el: '#rrapp',
+	data: {
+        showList: true,
+        title: null,
+		stockChange: {},
+		ruleValidate: {
+			name: [
+				{required: true, message: '名称不能为空', trigger: 'blur'}
+			]
+		},
+		q: {
+		    name: '',
+			orderId:'',
+			type:'',
+			time:'',
+			audit:'',
+			storeId:''
+		},
+		uploadData:[],
+		stores:[],
+		stockChangeTypes:[],
+		stockChangeAudits:[],
+		saveOrUpdateState:true,
+		merchList: {},//商户
+		thirdMerchantBizList: {},//第三方商户
+		storeList: {},//门店
+	},
+	methods: {
+		query: function () {
+			vm.reload();
+		},
+		add: function () {
+			vm.showList = false;
+			vm.title = "新增";
+			vm.stockChange = {};
+			vm.saveOrUpdateState=true;
+			vm.getMerchList();
+		},
+		update: function (event) {
+			vm.saveOrUpdateState=false;
+            let id = getSelectedRow();
+			if (id == null) {
+				alert("请选择数据!");
+				return;
+			}
+			vm.showList = false;
+            vm.title = "修改";
+			vm.getMerchList();
+            vm.getInfo(id)
+		},
+		saveOrUpdate: function (event) {
+
+            let url = vm.saveOrUpdateState ? "../stockchange/save" : "../stockchange/update";
+			var time = vm.stockChange.time;
+			vm.stockChange.time = vm.timeFommater(vm.stockChange.time);
+			$.ajax({
+				type: "POST",
+			    url: url,
+			    contentType: "application/json",
+			    data: JSON.stringify(vm.stockChange),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+			});
+		},
+		del: function (event) {
+            let ids = getSelectedRows();
+			if (ids == null){
+				alert("请选择至少一行!");
+				return;
+			}
+
+			confirm('确定要删除选中的记录?', function () {
+				$.ajax({
+					type: "POST",
+				    url: "../stockchange/delete",
+				    contentType: "application/json",
+				    data: JSON.stringify(ids),
+				    success: function (r) {
+						if (r.code == 0) {
+							alert('操作成功', function (index) {
+								$("#jqGrid").trigger("reloadGrid");
+							});
+						} else {
+							alert(r.msg);
+						}
+					}
+				});
+			});
+		},
+		audit: function (type) {
+			let ids = getSelectedRows();
+			if (ids == null){
+				alert("请选择至少一行!");
+				return;
+			}
+
+			console.log(type);
+
+			let param = {
+				"ids" : ids,
+				"type" : type,
+			}
+			let msg;
+			if (type == '1') {
+				msg = "确定要审核成功吗?";
+			} else {
+				msg = "确定要拒绝审核吗?";
+			}
+
+			confirm(msg, function () {
+				$.ajax({
+					type: "POST",
+					url: "../stockchange/audit",
+					contentType: "application/json",
+					data: JSON.stringify(param),
+					success: function (r) {
+						if (r.code == 0) {
+							alert('操作成功', function (index) {
+								$("#jqGrid").trigger("reloadGrid");
+							});
+						} else {
+							alert(r.msg);
+						}
+					}
+				});
+			});
+
+		},
+		getInfo: function(id){
+			$.get("../stockchange/info/"+id, function (r) {
+                vm.stockChange = r.stockChange;
+            });
+		},
+        reloadSearch: function() {
+            vm.q = {
+                name: ''
+            }
+            vm.reload();
+		},
+		reload: function (event) {
+			vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+			$("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name,'orderId':vm.q.orderId,'type':vm.q.type,'time':vm.q.time,'audit':vm.q.audit,"storeId":vm.q.storeId},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+		},
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        },
+		uploadExcelSuccess: function (data) {
+			if(data.code==0){
+				alert('导入成功', function (index) {
+					$("#jqGrid").trigger("reloadGrid");
+				});
+			}else{
+				alert(data.msg);
+			}
+		},
+		uploadExcelError: function () {
+			alert('上传出现异常,请重试!');
+		},
+		uploadExcelFormatError: function (file) {
+			this.$Notice.warning({
+				title: '文件格式不正确',
+				desc: '文件 ' + file.name + ' 格式不正确,请上传 xls 或 xlsx 格式的文件。'
+			});
+		},beforeUpload(){
+			vm.uploadData = {
+				storeId: vm.storeId,
+				mkaId : vm.mkaId
+			}
+			let promise = new Promise((resolve) => {
+				this.$nextTick(function () {
+					resolve(true);
+				});
+			});
+			return promise; //通过返回一个promis对象解决
+
+		},
+		timeFommater:function (value) {
+			var dateee = new Date(value).toJSON();
+			var date = new Date(+new Date(dateee) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '')
+			return date;
+		},
+		getMerchList: function() {
+			$.get("../merch/queryAll", function (r) {
+				vm.merchList = r.list;
+			});
+		},
+		getThirdMerchantBizList: function(merchSn) {
+			$.get("../thirdmerchantbiz/queryAll?merchSn=" + merchSn, function (r) {
+				vm.thirdMerchantBizList = r.list;
+			});
+		},
+		changeThirdMerchantBiz: function (opt) {
+			var value = opt.value;
+			$.get("../store/getStoresByThirdMerch?thirdPartyMerchCode=" + value, function (r) {
+				vm.storeList = r.list;
+			});
+		},
+		changeMerch: function(opt) {
+			var value = opt.value;
+			vm.getThirdMerchantBizList(value);
+		},
+		stockChangeRecordByOrderId: function (value) {
+			openWindow({
+				top: true,
+				type: 2,
+				title: '出入库单记录',
+				area: ['90%', '95%'],
+				content: '../shop/stockchangerecord.html?orderId='+value
+			});
+		},
+	},
+	mounted() {
+		// this.uploadList = this.$refs.upload.fileList;
+		/*$.get("../category/getCategorySelect", function (r) {
+            vm.queryCategories = r.list;
+        });*/
+		$.get("../sys/macro/queryMacrosByValue?value=stockChangeType", function (r) {
+			vm.stockChangeTypes = r.list;
+		});
+		$.get("../sys/macro/queryMacrosByValue?value=stockChangeAudit", function (r) {
+			vm.stockChangeAudits = r.list;
+		});
+		$.get("../store/queryAll", function (r) {
+			vm.stores = r.list;
+		});
+
+
+
+	}
+});

+ 255 - 0
kmall-admin/src/main/webapp/js/shop/stockchangerecord.js

@@ -0,0 +1,255 @@
+$(function () {
+	let orderId = getQueryString("orderId");
+	let url = '../stockchangerecord/list?1';
+	if (orderId) {
+		url += '&parentId=' + orderId;
+	}
+    $("#jqGrid").jqGrid({
+        url: url,
+        datatype: "json",
+        colModel: [
+			{label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+			{label: '单号', name: 'parentId', index: 'parentId', width: 60, align: 'center'},
+			{label: '门店id', name: 'storeId', index: 'store_id', width: 40, align: 'center'},
+			{label: 'sku', name: 'sku', index: 'sku', width: 60, align: 'center'},
+			{label: '类型', name: 'type', index: 'type', width: 40, align: 'center', formatter:function (value) {
+					if (value == '0') {
+						return '普通入库';
+					} else if (value == '1') {
+						return '调拨入库';
+					} else if (value == '2') {
+						return '销售出库';
+					} else if (value == '3') {
+						return '普通出库';
+					} else if (value == '4') {
+						return '调拨出库';
+					}
+					return '-';
+			}},
+			{label: '数量', name: 'number', index: 'number', width: 30, align: 'center'},
+			{label: '备注', name: 'remark', index: 'remark', width: 120, align: 'center'},
+			{label: '创建时间', name: 'createTime', index: 'create_time', width: 140, align: 'center', formatter:function (value) {
+				return new Date(value);
+			}},
+			{label: '修改时间', name: 'modifyTime', index: 'modify_time', width: 140, align: 'center', formatter:function (value) {
+				return new Date(value);
+			}},
+			{label: '订单编号', name: 'orderSn', index: 'order_sn', width: 60, align: 'center'}
+			],
+		viewrecords: true,
+        height: 550,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        },
+        changeThirdMerchantBiz: function (opt) {
+			var value = opt.value;
+			$.get("../store/getStoresByThirdMerch?thirdPartyMerchCode=" + value, function (r) {
+				vm.storeList = r.list;
+			});
+		}
+    });
+});
+
+let vm = new Vue({
+	el: '#rrapp',
+	data: {
+        showList: true,
+        title: null,
+		stockChangeRecord: {},
+		ruleValidate: {
+			name: [
+				{required: true, message: '名称不能为空', trigger: 'blur'}
+			]
+		},
+		q: {
+		    type: '',
+			parentId : '',
+			sku: '',
+			storeId : ''
+		},
+		merchList: {},//商户
+		thirdMerchantBizList: {},//第三方商户
+		storeList: {},//门店
+		uploadData:[],
+		stores: [],
+		macros: []
+	},
+	methods: {
+		query: function () {
+			vm.reload();
+		},
+		add: function () {
+			vm.showList = false;
+			vm.title = "新增";
+			vm.stockChangeRecord = {};
+			vm.getMerchList();
+		},
+		update: function (event) {
+            let id = getSelectedRow();
+			if (id == null) {
+				return;
+			}
+			vm.showList = false;
+            vm.title = "修改";
+			vm.getMerchList();
+
+            vm.getInfo(id);
+		},
+		saveOrUpdate: function (event) {
+            let url = vm.stockChangeRecord.id == null ? "../stockchangerecord/save" : "../stockchangerecord/update";
+			let s = JSON.stringify(vm.stockChangeRecord);
+			console.log("请求参数===> " + s);
+
+            $.ajax({
+				type: "POST",
+			    url: url,
+			    contentType: "application/json",
+			    data: s,
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+			});
+		},
+		del: function (event) {
+            let ids = getSelectedRows();
+			if (ids == null){
+				return;
+			}
+
+			confirm('确定要删除选中的记录?', function () {
+				$.ajax({
+					type: "POST",
+				    url: "../stockchangerecord/delete",
+				    contentType: "application/json",
+				    data: JSON.stringify(ids),
+				    success: function (r) {
+						if (r.code == 0) {
+							alert('操作成功', function (index) {
+								$("#jqGrid").trigger("reloadGrid");
+							});
+						} else {
+							alert(r.msg);
+						}
+					}
+				});
+			});
+		},
+		getInfo: function(id){
+			$.get("../stockchangerecord/info/"+id, function (r) {
+                vm.stockChangeRecord = r.stockChangeRecord;
+            });
+		},
+        reloadSearch: function() {
+            vm.q = {
+                name: ''
+            }
+            vm.reload();
+		},
+		reload: function (event) {
+			vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+			$("#jqGrid").jqGrid('setGridParam', {
+                postData: {
+                	'storeId': vm.q.storeId,
+					'type': vm.q.type,
+					'sku': vm.q.sku,
+					'parentId' : vm.q.parentId
+				},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+		},
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        },
+		uploadExcelSuccess: function (data) {
+			if(data.code==0){
+				alert('导入成功', function (index) {
+					$("#jqGrid").trigger("reloadGrid");
+				});
+			}else{
+				alert(data.msg);
+			}
+		},
+		uploadExcelError: function () {
+			alert('上传出现异常,请重试!');
+		},
+		uploadExcelFormatError: function (file) {
+			this.$Notice.warning({
+				title: '文件格式不正确',
+				desc: '文件 ' + file.name + ' 格式不正确,请上传 xls 或 xlsx 格式的文件。'
+			});
+		},beforeUpload(){
+			vm.uploadData = {
+				storeId: vm.storeId,
+				mkaId : vm.mkaId
+			}
+			let promise = new Promise((resolve) => {
+				this.$nextTick(function () {
+					resolve(true);
+				});
+			});
+			return promise; //通过返回一个promis对象解决
+
+		},
+		getMerchList: function() {
+			$.get("../merch/queryAll", function (r) {
+				vm.merchList = r.list;
+			});
+		},
+		changeMerch: function(opt) {
+			var value = opt.value;
+			vm.getThirdMerchantBizList(value);
+		},
+		getThirdMerchantBizList: function(merchSn) {
+			$.get("../thirdmerchantbiz/queryAll?merchSn=" + merchSn, function (r) {
+				vm.thirdMerchantBizList = r.list;
+			});
+		},
+		changeThirdMerchantBiz: function (opt) {
+			var value = opt.value;
+			$.get("../store/getStoresByThirdMerch?thirdPartyMerchCode=" + value, function (r) {
+				vm.storeList = r.list;
+			});
+		},
+	},
+	mounted() {
+		$.get("../store/queryAll", function (r) {
+			vm.stores = r.list;
+		});
+
+		$.get("../sys/macro/queryMacrosByValue?value=stockChangeType", function (r) {
+			vm.macros = r.list;
+		});
+
+	}
+});

+ 4 - 0
kmall-admin/src/main/webapp/js/shop/storemngchange.js

@@ -16,6 +16,10 @@ $(function () {
                         return '更新库存增加';
                     } else if (value == '4') {
                         return '更新库存减少';
+                    } else if (value == '5') {
+                        return '出库单';
+                    } else if (value == '6') {
+                        return '入库单';
                     }
                     return '-';
                 }

+ 15 - 1
kmall-admin/src/main/webapp/js/vip/mall2pointsrules.js

@@ -96,7 +96,21 @@ let vm = new Vue({
 		},
 		q: {
 		    name: ''
-		}
+		},
+		categoryObj: [
+			{
+				id : 0,
+				name : '门店'
+			},
+			{
+				id : 1,
+				name : '商品类别'
+			},
+			{
+				id : 2,
+				name : '门店商品'
+			}
+		]
 	},
 	methods: {
 		query: function () {

BIN
kmall-admin/src/main/webapp/statics/file/stock_change.xlsx


BIN
kmall-admin/src/main/webapp/statics/file/stock_change_record.xlsx


+ 22 - 0
kmall-api/src/main/java/com/kmall/api/api/ApiIndexController.java

@@ -139,6 +139,28 @@ public class ApiIndexController extends ApiBaseAction {
             return toResponsFail("系统异常");
         }
     }
+
+    /**
+     *  实名认证
+     * @param
+     * @return
+     */
+    @RequestMapping("idCardVerification")
+    @IgnoreAuth
+    public Object idCardVerification(){
+        //实名认证身份证信息
+        JSONObject jsonParam = getJsonRequest();
+        String idNo = jsonParam.getString("idNo");
+        String userName = jsonParam.getString("userName");
+        String result = IdCardUtil.checkIdCard(idNo, userName);
+        logger.info("idcard check result:"+result);
+        IdCardMsgVo vo = JSON.parseObject(result,IdCardMsgVo.class);
+        if(vo.getRespCode().equalsIgnoreCase("0000")){
+            return toResponsMsgSuccess("实名认证成功");
+        }else{
+            return toResponsFail(vo.getRespMessage());
+        }
+    }
     public static void main(String[] args) {
 
     }

+ 6 - 0
kmall-common/pom.xml

@@ -45,6 +45,12 @@
             <groupId>com.qcloud</groupId>
             <artifactId>cos_api</artifactId>
             <version>${qcloud-cos-version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <!-- httpclient -->

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff