zyp 4 месяцев назад
Родитель
Сommit
ac9d539559
100 измененных файлов с 5345 добавлено и 2817 удалено
  1. 1 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyMoneyLogsController.java
  2. 121 4
      fs-admin/src/main/java/com/fs/company/controller/CompanyStatisticsController.java
  3. 115 0
      fs-admin/src/main/java/com/fs/store/controller/FsChineseMedicineController.java
  4. 108 0
      fs-admin/src/main/java/com/fs/store/controller/FsDepartmentController.java
  5. 98 0
      fs-admin/src/main/java/com/fs/store/controller/FsDiseaseController.java
  6. 99 0
      fs-admin/src/main/java/com/fs/store/controller/FsDoctorArticleController.java
  7. 120 0
      fs-admin/src/main/java/com/fs/store/controller/FsFamousPrescribeController.java
  8. 107 0
      fs-admin/src/main/java/com/fs/store/controller/FsIllnessLibraryController.java
  9. 117 0
      fs-admin/src/main/java/com/fs/store/controller/FsMedicatedFoodController.java
  10. 116 0
      fs-admin/src/main/java/com/fs/store/controller/FsQuestionsController.java
  11. 4 1
      fs-admin/src/main/java/com/fs/store/controller/FsStoreOrderController.java
  12. 113 39
      fs-admin/src/main/java/com/fs/store/controller/FsStorePaymentController.java
  13. 39 0
      fs-admin/src/main/java/com/fs/store/controller/FsStoreProductController.java
  14. 38 11
      fs-admin/src/main/java/com/fs/store/controller/FsStoreStatisticsController.java
  15. 108 0
      fs-admin/src/main/java/com/fs/store/controller/FsTestReportController.java
  16. 115 0
      fs-admin/src/main/java/com/fs/store/controller/FsTestTempController.java
  17. 97 0
      fs-admin/src/main/java/com/fs/store/controller/FsTestTempItemController.java
  18. 5 3
      fs-admin/src/main/java/com/fs/store/controller/FsUserController.java
  19. 124 0
      fs-admin/src/main/java/com/fs/store/controller/FsVesselController.java
  20. 242 9
      fs-admin/src/main/java/com/fs/task/StoreTask.java
  21. 11 13
      fs-admin/src/main/java/com/fs/third/controller/FeiyuCustomerController.java
  22. 2 1
      fs-api/src/main/java/com/fs/app/controller/CommonController.java
  23. 22 5
      fs-api/src/main/java/com/fs/app/controller/PayController.java
  24. 0 2
      fs-common/src/main/java/com/fs/common/config/FSSysConfig.java
  25. 0 47
      fs-company-app/src/main/java/com/fs/wx/cp/config/QywxCacheConfig.java
  26. 0 133
      fs-company-app/src/main/java/com/fs/wx/cp/config/QywxThirdConfig.java
  27. 0 97
      fs-company-app/src/main/java/com/fs/wx/cp/controller/MpController.java
  28. 0 85
      fs-company-app/src/main/java/com/fs/wx/cp/controller/WxPortalController.java
  29. 0 8
      fs-company-app/src/main/java/com/fs/wx/cp/model/entity/QywxExtContactUser.java
  30. 0 8
      fs-company-app/src/main/java/com/fs/wx/cp/model/entity/QywxExtContactUserRemark.java
  31. 0 102
      fs-company-app/src/main/java/com/fs/wx/cp/model/entity/QywxThirdCompany.java
  32. 0 15
      fs-company-app/src/main/java/com/fs/wx/cp/model/entity/QywxThirdDepartment.java
  33. 0 102
      fs-company-app/src/main/java/com/fs/wx/cp/model/entity/QywxThirdUser.java
  34. 0 61
      fs-company-app/src/main/java/com/fs/wx/cp/model/entity/WechatCorpLogin.java
  35. 0 48
      fs-company-app/src/main/java/com/fs/wx/cp/model/excel/QywxContact.java
  36. 0 55
      fs-company-app/src/main/java/com/fs/wx/cp/model/xml/MessageReply.java
  37. 0 89
      fs-company-app/src/main/java/com/fs/wx/cp/model/xml/MessageText.java
  38. 0 33
      fs-company-app/src/main/java/com/fs/wx/cp/service/AccessTokenUtil.java
  39. 0 778
      fs-company-app/src/main/java/com/fs/wx/cp/service/QywxThirdService.java
  40. 0 188
      fs-company-app/src/main/java/com/fs/wx/cp/service/QywxUserUtil.java
  41. 0 58
      fs-company-app/src/main/java/com/fs/wx/util/AesException.java
  42. 0 26
      fs-company-app/src/main/java/com/fs/wx/util/ByteGroup.java
  43. 0 119
      fs-company-app/src/main/java/com/fs/wx/util/HttpUt.java
  44. 0 67
      fs-company-app/src/main/java/com/fs/wx/util/PKCS7Encoder.java
  45. 0 114
      fs-company-app/src/main/java/com/fs/wx/util/RestUtils.java
  46. 0 62
      fs-company-app/src/main/java/com/fs/wx/util/SHA1.java
  47. 0 292
      fs-company-app/src/main/java/com/fs/wx/util/WXBizMsgCrypt.java
  48. 0 71
      fs-company-app/src/main/java/com/fs/wx/util/XMLParse.java
  49. 0 69
      fs-company-app/src/main/java/com/fs/wx/util/XmlConvertUtils.java
  50. 1 1
      fs-company/src/main/java/com/fs/company/controller/CompanyConfigController.java
  51. 11 0
      fs-company/src/main/java/com/fs/company/controller/CompanyController.java
  52. 1 0
      fs-company/src/main/java/com/fs/company/controller/CompanyMoneyLogsController.java
  53. 185 0
      fs-service-system/src/main/java/com/fs/common/BeanCopyUtils.java
  54. 14 0
      fs-service-system/src/main/java/com/fs/company/vo/CompanyTuiMoneyStatisticsVO.java
  55. 21 0
      fs-service-system/src/main/java/com/fs/company/vo/StoreOrderStatisticsVO.java
  56. 4 0
      fs-service-system/src/main/java/com/fs/erp/domain/ErpGoods.java
  57. 0 1
      fs-service-system/src/main/java/com/fs/erp/domain/ErpGoodsStock.java
  58. 1 0
      fs-service-system/src/main/java/com/fs/erp/service/IErpGoodsService.java
  59. 1 0
      fs-service-system/src/main/java/com/fs/erp/service/impl/ErpGoodsServiceImpl.java
  60. 17 0
      fs-service-system/src/main/java/com/fs/huifuPay/config/HuiFuPayConfig.java
  61. 32 0
      fs-service-system/src/main/java/com/fs/huifuPay/demo/constants/DemoTestConstants.java
  62. 11 0
      fs-service-system/src/main/java/com/fs/huifuPay/demo/core/Identify.java
  63. 62 0
      fs-service-system/src/main/java/com/fs/huifuPay/demo/init/BaseCommon.java
  64. 49 0
      fs-service-system/src/main/java/com/fs/huifuPay/demo/init/OppsMerchantConfigDemo.java
  65. 15 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuCloseResult.java
  66. 22 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuCreateOrder.java
  67. 52 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuOnlinePay.java
  68. 52 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuOnlinePayQueryResult.java
  69. 32 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuOnlinePayResult.java
  70. 67 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuOnlineRefund.java
  71. 55 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuOnlineRefundQueryResult.java
  72. 59 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuOnlineRefundResult.java
  73. 14 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuPayInfo.java
  74. 126 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuQueryOrderResult.java
  75. 13 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuQueryResult.java
  76. 46 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuRefundResult.java
  77. 88 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuResult.java
  78. 38 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/HuifuCreateOrderResult.java
  79. 55 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/acctPayQueryResult.java
  80. 40 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/acctPayRefundQueryResult.java
  81. 52 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/acctPayRefundResult.java
  82. 69 0
      fs-service-system/src/main/java/com/fs/huifuPay/domain/acctPayResult.java
  83. 152 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/client/BasePayClient.java
  84. 108 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/BasePay.java
  85. 83 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/config/MerConfig.java
  86. 578 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/enums/FunctionCodeEnum.java
  87. 41 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/enums/ServerTypeEnum.java
  88. 55 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/exception/BasePayException.java
  89. 53 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/exception/FailureCode.java
  90. 180 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/net/AbstractRequest.java
  91. 87 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/net/BasePayRequest.java
  92. 55 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/net/BaseRequest.java
  93. 54 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/BaseRequest.java
  94. 152 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityAddRequest.java
  95. 68 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityQueryRequest.java
  96. 138 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityUnionpayMerbaseinfoApplyRequest.java
  97. 82 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityUnionpayMerbaseinfoQueryRequest.java
  98. 54 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityUnionpayQueryRequest.java
  99. 82 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityUnionpayRegisteStatusQueryRequest.java
  100. 96 0
      fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityUnionpaySignRequest.java

+ 1 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyMoneyLogsController.java

@@ -122,6 +122,7 @@ public class CompanyMoneyLogsController extends BaseController
             List<CompanyMoneyLogsExport1VO> list = companyMoneyLogsService.selectCompanyMoneyLogsExport1VOList(companyMoneyLogs);
             for (CompanyMoneyLogsExport1VO vo : list){
                 vo.setUserPhone(ParseUtils.parsePhone(vo.getUserPhone()));
+                vo.setUserAddress(ParseUtils.parseAddress(vo.getUserAddress()));
             }
             ExcelUtil<CompanyMoneyLogsExport1VO> util = new ExcelUtil<CompanyMoneyLogsExport1VO>(CompanyMoneyLogsExport1VO.class);
             return util.exportExcel(list, "商城订单");

+ 121 - 4
fs-admin/src/main/java/com/fs/company/controller/CompanyStatisticsController.java

@@ -13,11 +13,13 @@ import com.fs.company.param.CompanyStatisticsParam;
 import com.fs.company.service.ICompanySmsLogsService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.company.service.ICompanyVoiceLogsService;
-import com.fs.company.vo.CompanyPackageOrderStatisticsVO;
-import com.fs.company.vo.CompanySmsLogsStatisticsVO;
-import com.fs.company.vo.CompanyVoiceLogsStatisticsVO;
+import com.fs.company.vo.*;
 import com.fs.core.security.LoginUser;
 import com.fs.core.web.service.TokenService;
+import com.fs.store.domain.FsStoreOrder;
+import com.fs.store.mapper.FsStoreOrderMapper;
+import com.fs.store.vo.FsUserShareVO;
+import com.hc.openapi.tool.fastjson.JSON;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -46,7 +48,8 @@ public class CompanyStatisticsController extends BaseController
 //    private ICompanyPackageOrderService packageOrderService;
     @Autowired
     private ICompanyVoiceLogsService voiceLogsService;
-
+    @Autowired
+    private FsStoreOrderMapper fsStoreOrderMapper;
     @Autowired
     private ICompanySmsLogsService smsLogsService;
     @Autowired
@@ -173,5 +176,119 @@ public class CompanyStatisticsController extends BaseController
         }
     }
 
+    @PreAuthorize("@ss.hasPermi('company:statistics:exportTuiMoney')")
+    @GetMapping("/exportTuiMoney")
+    public AjaxResult exportTuiMoney(CompanyStatisticsParam param)
+    {
+        if(StringUtils.isNotEmpty(param.getUserIds())){
+            String[] userIds=param.getUserIds().split(",");
+            Long[] ids=new Long[userIds.length];
+            for(int i=0;i<ids.length; i++){
+                ids[i]=Long.parseLong(userIds[i]);
+            }
+            param.setUsers(ids);
+        }
+        else{
+            //获取所有员工
+            List<CompanyUser> users = userService.selectCompanyUserList(new CompanyUser());
+            List<Long> userIds = users.stream().map(element -> element.getUserId()).collect(Collectors.toList());
+            param.setUsers(userIds.toArray(new Long[userIds.size()]));
+        }
+
+        List<CompanyTuiMoneyStatisticsVO> list= fsStoreOrderMapper.selectSoreTuiMoneyStatisticsList(param);
+        ExcelUtil<CompanyTuiMoneyStatisticsVO> util = new ExcelUtil<CompanyTuiMoneyStatisticsVO>(CompanyTuiMoneyStatisticsVO.class);
+        return util.exportExcel(list, "voiceLogs");
+    }
+
+
+    @PreAuthorize("@ss.hasPermi('company:statistics:tuiMoney')")
+    @GetMapping("/tuiMoney")
+    public R tuiMoney(CompanyStatisticsParam param)
+    {
+        if(StringUtils.isNotEmpty(param.getUserIds())){
+            String[] userIds=param.getUserIds().split(",");
+            Long[] ids=new Long[userIds.length];
+            for(int i=0;i<ids.length; i++){
+                ids[i]=Long.parseLong(userIds[i]);
+            }
+            param.setUsers(ids);
+        }
+        else{
+            //获取部门下的所有用户
+            CompanyUser usermap=new CompanyUser();
+            usermap.setDeptId(param.getDeptId());
+            List<CompanyUser> users = userService.getUserListByDeptId(usermap);
+            List<Long> userIds = users.stream().map(element -> element.getUserId()).collect(Collectors.toList());
+            param.setUsers(userIds.toArray(new Long[userIds.size()]));
+        }
+        if(param.getUsers()!=null&&param.getUsers().length>0){
+            List<CompanyTuiMoneyStatisticsVO> list= fsStoreOrderMapper.selectSoreTuiMoneyStatisticsList(param);
+            TimeUtils.TimeEntity timeEntity=TimeUtils.parseTime(param.getType().toString(),param.getStartTime(),param.getEndTime());
+            timeEntity.setUserIds(param.getUsers());
+            Integer cycleNum = timeEntity.getCycleNum();
+            Integer beginTime = timeEntity.getBeginTime();
+            List<Integer> timeList = new ArrayList<>();
+            for (int i = 1; i <= cycleNum; i++) {
+                timeList.add(beginTime);
+                beginTime = TimeUtils.formatTime(beginTime);
+            }
+            List<JSONObject> jsonObjectList = fsStoreOrderMapper.selectTuiMoneyCounts(timeEntity.toMap());
+            List<String> dates = jsonObjectList.stream().map(jsonObject -> jsonObject.getString("type")).collect(Collectors.toList());
+            List<Integer> tuiMoneyCount = jsonObjectList.stream().map(jsonObject -> jsonObject.getInteger("tuiMoneyCount")).collect(Collectors.toList());
+            List<Integer> tuiMoney = jsonObjectList.stream().map(jsonObject -> jsonObject.getInteger("tuiMoney")).collect(Collectors.toList());
+            return R.ok().put("list",list).put("dates",dates).put("tuiMoneyCount",tuiMoneyCount).put("tuiMoney",tuiMoney);
+        }
+        else {
+            return R.ok("未查找到数据");
+        }
+    }
+
+
+    @GetMapping("/exportStoreProduct")
+    public AjaxResult exportStoreProduct(CompanyStatisticsParam param)
+    {
+        List<StoreOrderStatisticsVO> list = fsStoreOrderMapper.selectStoreProductStatisticsList(param);
+        for (StoreOrderStatisticsVO storeOrderStatisticsVO : list) {
+            String json = storeOrderStatisticsVO.getJson();
+            if (json!=null&& !json.isEmpty()) {
+                System.out.println(json);
+                StoreOrderStatisticsVO vo = JSON.parseObject(json, StoreOrderStatisticsVO.class);
+                storeOrderStatisticsVO.setBarCode(vo.getBarCode());
+                storeOrderStatisticsVO.setPrice(vo.getPrice());
+                storeOrderStatisticsVO.setGroupBarCode(vo.getGroupBarCode());
+                storeOrderStatisticsVO.setProductName(vo.getProductName());
+            }
+
+        }
+        ExcelUtil<StoreOrderStatisticsVO> util = new ExcelUtil<StoreOrderStatisticsVO>(StoreOrderStatisticsVO.class);
+        return util.exportExcel(list, "voiceLogs");
+    }
+
+
+
+    @GetMapping("/storeProduct")
+    public R storeProduct(CompanyStatisticsParam param)
+    {
+        List<StoreOrderStatisticsVO> list = fsStoreOrderMapper.selectStoreProductStatisticsList(param);
+        return R.ok().put("list",list);
+    }
+
+
+    @GetMapping("/exportUserTuiMoney")
+    public AjaxResult exportUserTuiMoney(CompanyStatisticsParam param)
+    {
+        List<FsUserShareVO> list = fsStoreOrderMapper.SelectUserTuiMoneyStatisticsList(param);
+        ExcelUtil<FsUserShareVO> util = new ExcelUtil<FsUserShareVO>(FsUserShareVO.class);
+        return util.exportExcel(list, "voiceLogs");
+    }
+
+
+
+    @GetMapping("/userTuiMoney")
+    public R userTuiMoney(CompanyStatisticsParam param)
+    {
+        List<FsUserShareVO> list = fsStoreOrderMapper.SelectUserTuiMoneyStatisticsList(param);
+        return R.ok().put("list",list);
+    }
 
 }

+ 115 - 0
fs-admin/src/main/java/com/fs/store/controller/FsChineseMedicineController.java

@@ -0,0 +1,115 @@
+package com.fs.store.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.store.domain.FsChineseMedicine;
+import com.fs.store.service.IFsChineseMedicineService;
+import com.fs.store.vo.FsChineseMedicineListVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 中药科普管理Controller
+ *
+ * @author fs
+ * @date 2023-10-23
+ */
+@RestController
+@RequestMapping("/his/chineseMedicine")
+public class FsChineseMedicineController extends BaseController
+{
+    @Autowired
+    private IFsChineseMedicineService fsChineseMedicineService;
+
+    /**
+     * 查询中药科普管理列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:chineseMedicine:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsChineseMedicine fsChineseMedicine)
+    {
+        startPage();
+        List<FsChineseMedicineListVO> list = fsChineseMedicineService.selectFsChineseMedicineListVO(fsChineseMedicine);
+        return getDataTable(list);
+    }
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<FsChineseMedicine> util = new ExcelUtil<>(FsChineseMedicine.class);
+        return util.importTemplateExcel("导入模板");
+    }
+
+
+    @Log(title = "导入", businessType = BusinessType.IMPORT)
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<FsChineseMedicine> util = new ExcelUtil<>(FsChineseMedicine.class);
+        List<FsChineseMedicine> list = util.importExcel(file.getInputStream());
+        String message = fsChineseMedicineService.importData(list);
+        return AjaxResult.success(message);
+    }
+    /**
+     * 导出中药科普管理列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:chineseMedicine:export')")
+    @Log(title = "中药科普管理", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsChineseMedicine fsChineseMedicine)
+    {
+        List<FsChineseMedicine> list = fsChineseMedicineService.selectFsChineseMedicineList(fsChineseMedicine);
+        ExcelUtil<FsChineseMedicine> util = new ExcelUtil<FsChineseMedicine>(FsChineseMedicine.class);
+        return util.exportExcel(list, "中药科普管理数据");
+    }
+
+    /**
+     * 获取中药科普管理详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:chineseMedicine:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(fsChineseMedicineService.selectFsChineseMedicineById(id));
+    }
+
+    /**
+     * 新增中药科普管理
+     */
+    @PreAuthorize("@ss.hasPermi('his:chineseMedicine:add')")
+    @Log(title = "中药科普管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsChineseMedicine fsChineseMedicine)
+    {
+        return toAjax(fsChineseMedicineService.insertFsChineseMedicine(fsChineseMedicine));
+    }
+
+    /**
+     * 修改中药科普管理
+     */
+    @PreAuthorize("@ss.hasPermi('his:chineseMedicine:edit')")
+    @Log(title = "中药科普管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsChineseMedicine fsChineseMedicine)
+    {
+        return toAjax(fsChineseMedicineService.updateFsChineseMedicine(fsChineseMedicine));
+    }
+
+    /**
+     * 删除中药科普管理
+     */
+    @PreAuthorize("@ss.hasPermi('his:chineseMedicine:remove')")
+    @Log(title = "中药科普管理", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fsChineseMedicineService.deleteFsChineseMedicineByIds(ids));
+    }
+}

+ 108 - 0
fs-admin/src/main/java/com/fs/store/controller/FsDepartmentController.java

@@ -0,0 +1,108 @@
+package com.fs.store.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.store.domain.FsDepartment;
+import com.fs.store.service.IFsDepartmentService;
+import com.fs.store.vo.OptionsVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 科室Controller
+ *
+ * @author fs
+ * @date 2023-06-01
+ */
+@RestController
+@RequestMapping("/his/department")
+public class FsDepartmentController extends BaseController
+{
+    @Autowired
+    private IFsDepartmentService fsDepartmentService;
+
+    /**
+     * 查询科室列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:department:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsDepartment fsDepartment)
+    {
+        startPage();
+        List<FsDepartment> list = fsDepartmentService.selectFsDepartmentList(fsDepartment);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出科室列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:department:export')")
+    @Log(title = "科室", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsDepartment fsDepartment)
+    {
+        List<FsDepartment> list = fsDepartmentService.selectFsDepartmentList(fsDepartment);
+        ExcelUtil<FsDepartment> util = new ExcelUtil<FsDepartment>(FsDepartment.class);
+        return util.exportExcel(list, "科室数据");
+    }
+
+    /**
+     * 获取科室详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:department:query')")
+    @GetMapping(value = "/{deptId}")
+    public AjaxResult getInfo(@PathVariable("deptId") Long deptId)
+    {
+        return AjaxResult.success(fsDepartmentService.selectFsDepartmentByDeptId(deptId));
+    }
+
+    /**
+     * 新增科室
+     */
+    @PreAuthorize("@ss.hasPermi('his:department:add')")
+    @Log(title = "科室", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsDepartment fsDepartment)
+    {
+        return toAjax(fsDepartmentService.insertFsDepartment(fsDepartment));
+    }
+
+    /**
+     * 修改科室
+     */
+    @PreAuthorize("@ss.hasPermi('his:department:edit')")
+    @Log(title = "科室", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsDepartment fsDepartment)
+    {
+        return toAjax(fsDepartmentService.updateFsDepartment(fsDepartment));
+    }
+
+    /**
+     * 删除科室
+     */
+    @PreAuthorize("@ss.hasPermi('his:department:remove')")
+    @Log(title = "科室", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{deptIds}")
+    public AjaxResult remove(@PathVariable Long[] deptIds)
+    {
+        return toAjax(fsDepartmentService.deleteFsDepartmentByDeptIds(deptIds));
+    }
+
+
+
+
+    @GetMapping("/listOptions")
+    public TableDataInfo listOptions()
+    {
+        List<OptionsVO> list = fsDepartmentService.selectFsDiseaseOptionsVO();
+        return getDataTable(list);
+    }
+}

+ 98 - 0
fs-admin/src/main/java/com/fs/store/controller/FsDiseaseController.java

@@ -0,0 +1,98 @@
+package com.fs.store.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.store.domain.FsDisease;
+import com.fs.store.service.IFsDiseaseService;
+import com.fs.store.vo.FsDiseaseListVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 疾病Controller
+ *
+ * @author fs
+ * @date 2023-06-01
+ */
+@RestController
+@RequestMapping("/his/disease")
+public class FsDiseaseController extends BaseController
+{
+    @Autowired
+    private IFsDiseaseService fsDiseaseService;
+
+    /**
+     * 查询疾病列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:disease:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsDisease fsDisease)
+    {
+        startPage();
+        List<FsDiseaseListVO> list = fsDiseaseService.selectFsDiseaseListVO(fsDisease);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出疾病列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:disease:export')")
+    @Log(title = "疾病", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsDisease fsDisease)
+    {
+        List<FsDisease> list = fsDiseaseService.selectFsDiseaseList(fsDisease);
+        ExcelUtil<FsDisease> util = new ExcelUtil<FsDisease>(FsDisease.class);
+        return util.exportExcel(list, "疾病数据");
+    }
+
+    /**
+     * 获取疾病详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:disease:query')")
+    @GetMapping(value = "/{diseaseId}")
+    public AjaxResult getInfo(@PathVariable("diseaseId") Long diseaseId)
+    {
+        return AjaxResult.success(fsDiseaseService.selectFsDiseaseVOByDiseaseId(diseaseId));
+    }
+
+    /**
+     * 新增疾病
+     */
+    @PreAuthorize("@ss.hasPermi('his:disease:add')")
+    @Log(title = "疾病", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsDisease fsDisease)
+    {
+        return toAjax(fsDiseaseService.insertFsDisease(fsDisease));
+    }
+
+    /**
+     * 修改疾病
+     */
+    @PreAuthorize("@ss.hasPermi('his:disease:edit')")
+    @Log(title = "疾病", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsDisease fsDisease)
+    {
+        return toAjax(fsDiseaseService.updateFsDisease(fsDisease));
+    }
+
+    /**
+     * 删除疾病
+     */
+    @PreAuthorize("@ss.hasPermi('his:disease:remove')")
+    @Log(title = "疾病", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{diseaseIds}")
+    public AjaxResult remove(@PathVariable Long[] diseaseIds)
+    {
+        return toAjax(fsDiseaseService.deleteFsDiseaseByDiseaseIds(diseaseIds));
+    }
+}

+ 99 - 0
fs-admin/src/main/java/com/fs/store/controller/FsDoctorArticleController.java

@@ -0,0 +1,99 @@
+package com.fs.store.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.store.domain.FsDoctorArticle;
+import com.fs.store.service.IFsDoctorArticleService;
+import com.fs.store.vo.FsDoctorArticleListVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 医生文章Controller
+ *
+ * @author fs
+ * @date 2023-06-05
+ */
+@RestController
+@RequestMapping("/his/doctorArticle")
+public class FsDoctorArticleController extends BaseController
+{
+    @Autowired
+    private IFsDoctorArticleService fsDoctorArticleService;
+
+    /**
+     * 查询医生文章列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:doctorArticle:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsDoctorArticle fsDoctorArticle)
+    {
+        startPage();
+        List<FsDoctorArticleListVO> list = fsDoctorArticleService.selectFsDoctorArticleListVO(fsDoctorArticle);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出医生文章列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:article:export')")
+    @Log(title = "医生文章", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsDoctorArticle fsDoctorArticle)
+    {
+        List<FsDoctorArticle> list = fsDoctorArticleService.selectFsDoctorArticleList(fsDoctorArticle);
+        ExcelUtil<FsDoctorArticle> util = new ExcelUtil<FsDoctorArticle>(FsDoctorArticle.class);
+        return util.exportExcel(list, "医生文章数据");
+    }
+
+    /**
+     * 获取医生文章详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:article:query')")
+    @GetMapping(value = "/{articleId}")
+    public AjaxResult getInfo(@PathVariable("articleId") Long articleId)
+    {
+        return AjaxResult.success(fsDoctorArticleService.selectFsDoctorArticleByArticleId(articleId));
+    }
+
+    /**
+     * 新增医生文章
+     */
+    @PreAuthorize("@ss.hasPermi('his:article:add')")
+    @Log(title = "医生文章", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsDoctorArticle fsDoctorArticle)
+    {
+        return toAjax(fsDoctorArticleService.insertFsDoctorArticle(fsDoctorArticle));
+    }
+
+    /**
+     * 修改医生文章
+     */
+    @PreAuthorize("@ss.hasPermi('his:article:edit')")
+    @Log(title = "医生文章", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsDoctorArticle fsDoctorArticle)
+    {
+        return toAjax(fsDoctorArticleService.updateFsDoctorArticle(fsDoctorArticle));
+    }
+
+    /**
+     * 删除医生文章
+     */
+    @PreAuthorize("@ss.hasPermi('his:article:remove')")
+    @Log(title = "医生文章", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{articleIds}")
+    public AjaxResult remove(@PathVariable Long[] articleIds)
+    {
+        return toAjax(fsDoctorArticleService.deleteFsDoctorArticleByArticleIds(articleIds));
+    }
+
+}

+ 120 - 0
fs-admin/src/main/java/com/fs/store/controller/FsFamousPrescribeController.java

@@ -0,0 +1,120 @@
+package com.fs.store.controller;
+
+import com.fs.common.BeanCopyUtils;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.store.domain.FsFamousPrescribe;
+import com.fs.store.service.IFsFamousPrescribeService;
+import com.fs.store.vo.FsFamousPrescribeExecelVO;
+import com.fs.store.vo.FsFamousPrescribeListVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 经典名方Controller
+ *
+ * @author fs
+ * @date 2023-10-23
+ */
+@RestController
+@RequestMapping("/his/famousPrescribe")
+public class FsFamousPrescribeController extends BaseController
+{
+    @Autowired
+    private IFsFamousPrescribeService fsFamousPrescribeService;
+
+    /**
+     * 查询经典名方列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:famousPrescribe:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsFamousPrescribe fsFamousPrescribe)
+    {
+        startPage();
+        List<FsFamousPrescribeListVO> list = fsFamousPrescribeService.selectFsFamousPrescribeListVO(fsFamousPrescribe);
+        return getDataTable(list);
+    }
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<FsFamousPrescribeExecelVO> util = new ExcelUtil<>(FsFamousPrescribeExecelVO.class);
+        return util.importTemplateExcel("导入模板");
+    }
+
+
+    @Log(title = "导入", businessType = BusinessType.IMPORT)
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<FsFamousPrescribeExecelVO> util = new ExcelUtil<>(FsFamousPrescribeExecelVO.class);
+        List<FsFamousPrescribeExecelVO> list = util.importExcel(file.getInputStream());
+        System.out.println(list);
+        String message = fsFamousPrescribeService.importData(list);
+        return AjaxResult.success(message);
+    }
+
+    /**
+     * 导出经典名方列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:famousPrescribe:export')")
+    @Log(title = "经典名方", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsFamousPrescribe fsFamousPrescribe)
+    {
+        List<FsFamousPrescribe> list = fsFamousPrescribeService.selectFsFamousPrescribeList(fsFamousPrescribe);
+        List<FsFamousPrescribeExecelVO> fsFamousPrescribes = BeanCopyUtils.copyList(list, FsFamousPrescribeExecelVO.class);
+        ExcelUtil<FsFamousPrescribeExecelVO> util = new ExcelUtil<FsFamousPrescribeExecelVO>(FsFamousPrescribeExecelVO.class);
+        return util.exportExcel(fsFamousPrescribes, "经典名方数据");
+    }
+
+    /**
+     * 获取经典名方详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:famousPrescribe:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(fsFamousPrescribeService.selectFsFamousPrescribeById(id));
+    }
+
+    /**
+     * 新增经典名方
+     */
+    @PreAuthorize("@ss.hasPermi('his:famousPrescribe:add')")
+    @Log(title = "经典名方", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsFamousPrescribe fsFamousPrescribe)
+    {
+        return toAjax(fsFamousPrescribeService.insertFsFamousPrescribe(fsFamousPrescribe));
+    }
+
+    /**
+     * 修改经典名方
+     */
+    @PreAuthorize("@ss.hasPermi('his:famousPrescribe:edit')")
+    @Log(title = "经典名方", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsFamousPrescribe fsFamousPrescribe)
+    {
+        return toAjax(fsFamousPrescribeService.updateFsFamousPrescribe(fsFamousPrescribe));
+    }
+
+    /**
+     * 删除经典名方
+     */
+    @PreAuthorize("@ss.hasPermi('his:famousPrescribe:remove')")
+    @Log(title = "经典名方", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fsFamousPrescribeService.deleteFsFamousPrescribeByIds(ids));
+    }
+}

+ 107 - 0
fs-admin/src/main/java/com/fs/store/controller/FsIllnessLibraryController.java

@@ -0,0 +1,107 @@
+package com.fs.store.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.store.domain.FsIllnessLibrary;
+import com.fs.store.param.FsIllnessLibraryNameParam;
+import com.fs.store.service.IFsIllnessLibraryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 中医疾病Controller
+ *
+ * @author fs
+ * @date 2023-09-04
+ */
+@RestController
+@RequestMapping("/his/illnessLibrary")
+public class FsIllnessLibraryController extends BaseController
+{
+    @Autowired
+    private IFsIllnessLibraryService fsIllnessLibraryService;
+
+    /**
+     * 查询中医疾病列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:illnessLibrary:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsIllnessLibrary fsIllnessLibrary)
+    {
+        startPage();
+        List<FsIllnessLibrary> list = fsIllnessLibraryService.selectFsIllnessLibraryList(fsIllnessLibrary);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出中医疾病列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:illnessLibrary:export')")
+    @Log(title = "中医疾病", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsIllnessLibrary fsIllnessLibrary)
+    {
+        List<FsIllnessLibrary> list = fsIllnessLibraryService.selectFsIllnessLibraryList(fsIllnessLibrary);
+        ExcelUtil<FsIllnessLibrary> util = new ExcelUtil<FsIllnessLibrary>(FsIllnessLibrary.class);
+        return util.exportExcel(list, "中医疾病数据");
+    }
+
+    /**
+     * 获取中医疾病详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:illnessLibrary:query')")
+    @GetMapping(value = "/{illnessId}")
+    public AjaxResult getInfo(@PathVariable("illnessId") Long illnessId)
+    {
+        return AjaxResult.success(fsIllnessLibraryService.selectFsIllnessLibraryByIllnessId(illnessId));
+    }
+
+
+
+    @GetMapping(value = "getIllness")
+    public TableDataInfo getIllness(FsIllnessLibraryNameParam name)
+    {
+        startPage();
+        return getDataTable(fsIllnessLibraryService.selectFsIllnessLibraryVOByIllnessName(name.getName()));
+    }
+
+    /**
+     * 新增中医疾病
+     */
+    @PreAuthorize("@ss.hasPermi('his:illnessLibrary:add')")
+    @Log(title = "中医疾病", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsIllnessLibrary fsIllnessLibrary)
+    {
+        return toAjax(fsIllnessLibraryService.insertFsIllnessLibrary(fsIllnessLibrary));
+    }
+
+    /**
+     * 修改中医疾病
+     */
+    @PreAuthorize("@ss.hasPermi('his:illnessLibrary:edit')")
+    @Log(title = "中医疾病", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsIllnessLibrary fsIllnessLibrary)
+    {
+        return toAjax(fsIllnessLibraryService.updateFsIllnessLibrary(fsIllnessLibrary));
+    }
+
+    /**
+     * 删除中医疾病
+     */
+    @PreAuthorize("@ss.hasPermi('his:illnessLibrary:remove')")
+    @Log(title = "中医疾病", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{illnessIds}")
+    public AjaxResult remove(@PathVariable Long[] illnessIds)
+    {
+        return toAjax(fsIllnessLibraryService.deleteFsIllnessLibraryByIllnessIds(illnessIds));
+    }
+}

+ 117 - 0
fs-admin/src/main/java/com/fs/store/controller/FsMedicatedFoodController.java

@@ -0,0 +1,117 @@
+package com.fs.store.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.store.domain.FsMedicatedFood;
+import com.fs.store.service.IFsMedicatedFoodService;
+import com.fs.store.vo.FsMedicatedFoodLListVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 药膳食疗Controller
+ *
+ * @author fs
+ * @date 2023-10-23
+ */
+@RestController
+@RequestMapping("/his/medicatedFood")
+public class FsMedicatedFoodController extends BaseController
+{
+    @Autowired
+    private IFsMedicatedFoodService fsMedicatedFoodService;
+
+
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<FsMedicatedFood> util = new ExcelUtil<>(FsMedicatedFood.class);
+        return util.importTemplateExcel("导入模板");
+    }
+
+
+    @Log(title = "导入", businessType = BusinessType.IMPORT)
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<FsMedicatedFood> util = new ExcelUtil<>(FsMedicatedFood.class);
+        List<FsMedicatedFood> list = util.importExcel(file.getInputStream());
+        String message = fsMedicatedFoodService.importDataMedicatedFoodExcel(list, updateSupport);
+        return AjaxResult.success(message);
+    }
+    /**
+     * 查询药膳食疗列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:medicatedFood:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsMedicatedFood fsMedicatedFood)
+    {
+        startPage();
+        List<FsMedicatedFoodLListVO> list = fsMedicatedFoodService.selectFsMedicatedFoodListVO(fsMedicatedFood);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出药膳食疗列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:medicatedFood:export')")
+    @Log(title = "药膳食疗", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsMedicatedFood fsMedicatedFood)
+    {
+        List<FsMedicatedFood> list = fsMedicatedFoodService.selectFsMedicatedFoodList(fsMedicatedFood);
+        ExcelUtil<FsMedicatedFood> util = new ExcelUtil<FsMedicatedFood>(FsMedicatedFood.class);
+        return util.exportExcel(list, "药膳食疗数据");
+    }
+
+    /**
+     * 获取药膳食疗详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:medicatedFood:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(fsMedicatedFoodService.selectFsMedicatedFoodById(id));
+    }
+
+    /**
+     * 新增药膳食疗
+     */
+    @PreAuthorize("@ss.hasPermi('his:medicatedFood:add')")
+    @Log(title = "药膳食疗", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsMedicatedFood fsMedicatedFood)
+    {
+        return toAjax(fsMedicatedFoodService.insertFsMedicatedFood(fsMedicatedFood));
+    }
+
+    /**
+     * 修改药膳食疗
+     */
+    @PreAuthorize("@ss.hasPermi('his:medicatedFood:edit')")
+    @Log(title = "药膳食疗", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsMedicatedFood fsMedicatedFood)
+    {
+        return toAjax(fsMedicatedFoodService.updateFsMedicatedFood(fsMedicatedFood));
+    }
+
+    /**
+     * 删除药膳食疗
+     */
+    @PreAuthorize("@ss.hasPermi('his:medicatedFood:remove')")
+    @Log(title = "药膳食疗", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fsMedicatedFoodService.deleteFsMedicatedFoodByIds(ids));
+    }
+}

+ 116 - 0
fs-admin/src/main/java/com/fs/store/controller/FsQuestionsController.java

@@ -0,0 +1,116 @@
+package com.fs.store.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.store.domain.FsQuestions;
+import com.fs.store.service.IFsQuestionsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 问答专区Controller
+ *
+ * @author fs
+ * @date 2023-10-23
+ */
+@RestController
+@RequestMapping("/his/questions")
+public class FsQuestionsController extends BaseController
+{
+    @Autowired
+    private IFsQuestionsService fsQuestionsService;
+
+    /**
+     * 查询问答专区列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:questions:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsQuestions fsQuestions)
+    {
+        startPage();
+        List<FsQuestions> list = fsQuestionsService.selectFsQuestionsList(fsQuestions);
+        return getDataTable(list);
+    }
+
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<FsQuestions> util = new ExcelUtil<>(FsQuestions.class);
+        return util.importTemplateExcel("导入模板");
+    }
+
+
+    @Log(title = "导入", businessType = BusinessType.IMPORT)
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<FsQuestions> util = new ExcelUtil<>(FsQuestions.class);
+        List<FsQuestions> list = util.importExcel(file.getInputStream());
+        String message = fsQuestionsService.importData(list);
+        return AjaxResult.success(message);
+    }
+
+    /**
+     * 导出问答专区列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:questions:export')")
+    @Log(title = "问答专区", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsQuestions fsQuestions)
+    {
+        List<FsQuestions> list = fsQuestionsService.selectFsQuestionsList(fsQuestions);
+        ExcelUtil<FsQuestions> util = new ExcelUtil<FsQuestions>(FsQuestions.class);
+        return util.exportExcel(list, "问答专区数据");
+    }
+
+    /**
+     * 获取问答专区详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:questions:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(fsQuestionsService.selectFsQuestionsById(id));
+    }
+
+    /**
+     * 新增问答专区
+     */
+    @PreAuthorize("@ss.hasPermi('his:questions:add')")
+    @Log(title = "问答专区", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsQuestions fsQuestions)
+    {
+        return toAjax(fsQuestionsService.insertFsQuestions(fsQuestions));
+    }
+
+    /**
+     * 修改问答专区
+     */
+    @PreAuthorize("@ss.hasPermi('his:questions:edit')")
+    @Log(title = "问答专区", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsQuestions fsQuestions)
+    {
+        return toAjax(fsQuestionsService.updateFsQuestions(fsQuestions));
+    }
+
+    /**
+     * 删除问答专区
+     */
+    @PreAuthorize("@ss.hasPermi('his:questions:remove')")
+    @Log(title = "问答专区", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fsQuestionsService.deleteFsQuestionsByIds(ids));
+    }
+}

+ 4 - 1
fs-admin/src/main/java/com/fs/store/controller/FsStoreOrderController.java

@@ -300,7 +300,10 @@ public class FsStoreOrderController extends BaseController {
         order.setUserPhone(ParseUtils.parsePhone(order.getUserPhone()));
         order.setUserAddress(ParseUtils.parseAddress(order.getUserAddress()));
         FsUser user = userService.selectFsUserById(order.getUserId());
-        user.setPhone(ParseUtils.parsePhone(user.getPhone()));
+        if (user!=null){
+            user.setPhone(ParseUtils.parsePhone(user.getPhone()));
+        }
+
         FsStoreOrderItem itemMap = new FsStoreOrderItem();
         itemMap.setOrderId(order.getId());
         List<FsStoreOrderItem> items = orderItemService.selectFsStoreOrderItemList(itemMap);

+ 113 - 39
fs-admin/src/main/java/com/fs/store/controller/FsStorePaymentController.java

@@ -1,16 +1,26 @@
 package com.fs.store.controller;
 
 import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import cn.hutool.json.JSONUtil;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.domain.AlipayTradeRefundModel;
 import com.fs.common.core.domain.R;
+import com.fs.common.exception.CustomException;
+import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.service.ICompanyService;
+import com.fs.huifuPay.domain.HuiFuQueryOrderResult;
+import com.fs.huifuPay.domain.HuiFuRefundResult;
+import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayQueryRequest;
+import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
+import com.fs.huifuPay.service.HuiFuService;
 import com.fs.pay.bean.AliPayBean;
 import com.fs.pay.pay.domain.OrderResult;
 import com.fs.pay.pay.domain.RefundResult;
@@ -56,7 +66,8 @@ public class FsStorePaymentController extends BaseController
     private AliPayBean aliPayBean;
     @Autowired
     PayService ybPayService;
-
+    @Autowired
+    HuiFuService huiFuService;
     @Autowired
     private ICompanyService companyService;
 
@@ -115,35 +126,72 @@ public class FsStorePaymentController extends BaseController
     @PostMapping("/returnPayStatus")
     public R returnPayStatus(@RequestBody FsStorePayment fsStorePayment) throws Exception
     {
-        OrderQueryDTO o = new OrderQueryDTO();
-        o.setUpOrderId(fsStorePayment.getTradeNo());
-        OrderResult orderResult = ybPayService.getOrder(o);
-        if (orderResult != null ){
-            if ("4".equals(orderResult.getState())) {
-                return R.error("订单未支付");
-            }
-            if ("5".equals(orderResult.getState())) {
-                return R.error("订单已退款");
+        FsStorePayment payment=  fsStorePaymentService.selectFsStorePaymentByTradeNo(fsStorePayment.getTradeNo());
+        String payMode = payment.getPayMode();
+        logger.info("手动查询"+payment);
+        if (payMode.equals("hf")){
+            V2TradePaymentScanpayQueryRequest request = new V2TradePaymentScanpayQueryRequest();
+            request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
+            request.setOrgHfSeqId(payment.getTradeNo());
+            HuiFuQueryOrderResult o = null;
+            try {
+                o = huiFuService.queryOrder(request);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
             }
-            if ("0".equals(orderResult.getState())){
-                String[] order=orderResult.getLowOrderId().split("-");
-                if(orderResult.getStatus().equals("100")){
+            logger.info("汇付返回"+o);
+            if ("00000000".equals(o.getResp_code())) {
+                if (o.getTrans_stat().equals("S")) {
+                    String[] order=o.getOrg_req_seq_id().split("-");
                     switch (order[0]) {
                         case "store":
-                            orderService.payConfirm(1,null,order[1], o.getUpOrderId(),orderResult.getBankTrxId(),orderResult.getBankOrderId());
+                             orderService.payConfirm(1,null,order[1], o.getOrg_hf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
+                             break;
                         case "store_remain":
-                            orderService.payRemainConfirm( order[1], o.getUpOrderId(),orderResult.getBankTrxId(),orderResult.getBankOrderId());
+                             orderService.payRemainConfirm( order[1], o.getOrg_hf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
+                            break;
                         case "payment":
-                            fsStorePaymentService.payConfirm(order[1],o.getUpOrderId(),orderResult.getBankTrxId(),orderResult.getBankOrderId());
+                             fsStorePaymentService.payConfirm(order[1],o.getOrg_hf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
+                            break;
                     }
                     return R.ok();
+                }
+            }
+        }else if (payMode.equals("yb")){
+            OrderQueryDTO o = new OrderQueryDTO();
+            o.setUpOrderId(payment.getTradeNo());
+            OrderResult orderResult = ybPayService.getOrder(o);
+            if (orderResult != null ){
+                if ("4".equals(orderResult.getState())) {
+                    return R.error("订单未支付");
+                }
+                if ("5".equals(orderResult.getState())) {
+                    return R.error("订单已退款");
+                }
+                if ("0".equals(orderResult.getState())){
+                    String[] order=orderResult.getLowOrderId().split("-");
+                    if(orderResult.getStatus().equals("100")){
+                        switch (order[0]) {
+                            case "store":
+                                orderService.payConfirm(1,null,order[1], o.getUpOrderId(),orderResult.getBankTrxId(),orderResult.getBankOrderId());
+                                break;
+                            case "store_remain":
+                                orderService.payRemainConfirm( order[1], o.getUpOrderId(),orderResult.getBankTrxId(),orderResult.getBankOrderId());
+                                break;
+                            case "payment":
+                                fsStorePaymentService.payConfirm(order[1],o.getUpOrderId(),orderResult.getBankTrxId(),orderResult.getBankOrderId());
+                                break;
+                        }
+                        return R.ok();
+                    }else {
+                        return R.error("请检查外部订单号");
+                    }
                 }else {
-                    return R.error("请检查外部订单号");
+                    return R.error("订单支付状态异常,联系财务检查");
                 }
-            }else {
-                return R.error("订单支付状态异常,联系财务检查");
             }
         }
+
         return R.error("请检查外部订单号");
     }
 
@@ -176,29 +224,55 @@ public class FsStorePaymentController extends BaseController
             return R.error("退款金额必须小于等于付款金额");
         }
         if(payment.getPayTypeCode().equals("weixin")){
+            if (payment.getPayMode()==null||payment.getPayMode().equals("yb")){
+                com.fs.pay.pay.dto.RefundDTO refundDTO = new com.fs.pay.pay.dto.RefundDTO();
+                refundDTO.setRefundMoney(fsStorePayment.getRefundMoney().toString());
+                refundDTO.setLowRefundNo("refund-"+payment.getPayCode());
+                refundDTO.setUpOrderId(payment.getTradeNo());
+                RefundResult result=ybPayService.refund(refundDTO);
+                if(result.getState().equals("5")||result.getState().equals("6")){
+                    payment.setRefundMoney(fsStorePayment.getRefundMoney());
+                    payment.setStatus(-1);
+                    payment.setRefundTime(new Date());
+                    fsStorePaymentService.updateFsStorePayment(payment);
+                    //收款 减去所有
+                    if(payment.getCompanyId()!=null&&payment.getCompanyId()>0){
+                        companyService.subCompanyPaymentMoney(payment);
+                    }
+                    return R.ok();
+                }
+                else{
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    return R.error(result.getMessage());
+                }
+            }else if (payment.getPayMode()!=null&&payment.getPayMode().equals("hf")){
+                V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
+                request.setOrdAmt(payment.getPayMoney().toString());
+                request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
+                request.setReqSeqId("refund-"+payment.getPayCode());
+                Map<String, Object> extendInfoMap = new HashMap<>();
+                extendInfoMap.put("org_party_order_id", payment.getBankSerialNo());
+                request.setExtendInfo(extendInfoMap);
+                HuiFuRefundResult refund = huiFuService.refund(request);
+                logger.info("退款:"+refund);
+                if((refund.getResp_code().equals("00000000")||refund.getResp_code().equals("00000100"))&&(refund.getTrans_stat().equals("S")||refund.getTrans_stat().equals("P"))){
+                    payment.setRefundMoney(fsStorePayment.getRefundMoney());
+                    payment.setStatus(-1);
+                    payment.setRefundTime(new Date());
+                    fsStorePaymentService.updateFsStorePayment(payment);
+                    //收款 减去所有
+                    if(payment.getCompanyId()!=null&&payment.getCompanyId()>0){
+                        companyService.subCompanyPaymentMoney(payment);
+                    }
+                    return R.ok();
+                }else {
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    return R.error(refund.getResp_desc());
+                }
 
+            }
             //易宝退款
-            com.fs.pay.pay.dto.RefundDTO refundDTO = new com.fs.pay.pay.dto.RefundDTO();
-            refundDTO.setRefundMoney(fsStorePayment.getRefundMoney().toString());
-            refundDTO.setLowRefundNo("refund-"+payment.getPayCode());
-            refundDTO.setUpOrderId(payment.getTradeNo());
-            RefundResult result=ybPayService.refund(refundDTO);
 
-            if(result.getState().equals("5")||result.getState().equals("6")){
-                payment.setRefundMoney(fsStorePayment.getRefundMoney());
-                payment.setStatus(-1);
-                payment.setRefundTime(new Date());
-                fsStorePaymentService.updateFsStorePayment(payment);
-                //收款 减去所有
-                if(payment.getCompanyId()!=null&&payment.getCompanyId()>0){
-                    companyService.subCompanyPaymentMoney(payment);
-                }
-                return R.ok();
-            }
-            else{
-                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                return R.error(result.getMessage());
-            }
 
             //小雨点退款
 //            payment.setRefundMoney(fsStorePayment.getRefundMoney());

+ 39 - 0
fs-admin/src/main/java/com/fs/store/controller/FsStoreProductController.java

@@ -34,6 +34,7 @@ import com.fs.store.domain.FsStoreProduct;
 import com.fs.store.service.IFsStoreProductService;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.common.core.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -87,6 +88,26 @@ public class FsStoreProductController extends BaseController
         return util.exportExcel(list, "storeProduct");
     }
 
+
+    @Log(title = "商品导入", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('store:storeProduct:import')")
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<FsStoreProductExportVO> util = new ExcelUtil<>(FsStoreProductExportVO.class);
+        List<FsStoreProductExportVO> list = util.importExcel(file.getInputStream());
+        String message = fsStoreProductService.importStoreProduct(list, updateSupport);
+        return AjaxResult.success(message);
+    }
+
+
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<FsStoreProductExportVO> util = new ExcelUtil<>(FsStoreProductExportVO.class);
+        return util.importTemplateExcel("商品数据");
+    }
+
     /**
      * 获取商品详细信息
      */
@@ -107,6 +128,10 @@ public class FsStoreProductController extends BaseController
         if (fsStoreProduct.getIsShow() ==1){
             logger.info("商品上架:{}",fsStoreProduct.getProductName()+new Date());
         }
+
+        if (fsStoreProduct.getIsDisplay() ==1){
+            logger.info("商品前端展示:{}",fsStoreProduct.getProductName()+new Date());
+        }
         return fsStoreProductService.addOrEdit(fsStoreProduct);
     }
 
@@ -124,6 +149,20 @@ public class FsStoreProductController extends BaseController
         return toAjax(fsStoreProductService.deleteFsStoreProductByIds(productIds));
     }
 
+    @PreAuthorize("@ss.hasPermi('store:storeProduct:putOn')")
+    @Log(title = "商品", businessType = BusinessType.DELETE)
+    @PostMapping("/putOn/{productIds}")
+    public AjaxResult putOn(@PathVariable Long[] productIds)
+    {
+        return toAjax(fsStoreProductService.updateFsStoreProductIsShow(productIds,1));
+    }
+    @PreAuthorize("@ss.hasPermi('store:storeProduct:pullOff')")
+    @Log(title = "商品", businessType = BusinessType.DELETE)
+    @PostMapping("/pullOff/{productIds}")
+    public AjaxResult pullOff(@PathVariable Long[] productIds)
+    {
+        return toAjax(fsStoreProductService.updateFsStoreProductIsShow(productIds,0));
+    }
     @ApiOperation(value = "生成属性")
     @PostMapping(value = "/genFormatAttr/{productId}")
     public ResponseEntity genFormatAttr(@PathVariable Long productId, @RequestBody String jsonStr){

+ 38 - 11
fs-admin/src/main/java/com/fs/store/controller/FsStoreStatisticsController.java

@@ -17,13 +17,12 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
  * 统计
- * 
+ *
  * @author fs
  * @date 2021-03-22
  */
@@ -72,10 +71,24 @@ public class FsStoreStatisticsController extends BaseController
                 beginTime = TimeUtils.formatTime(beginTime);
             }
             List<JSONObject> jsonObjectList = storeOrderService.selectFsStoreOrderCounts(timeEntity.toMap());
-            List<String> dates = jsonObjectList.stream().map(jsonObject -> jsonObject.getString("type")).collect(Collectors.toList());
-            List<Integer> orderCount = jsonObjectList.stream().map(jsonObject -> jsonObject.getInteger("orderCount")).collect(Collectors.toList());
-            List<Integer> payPrice = jsonObjectList.stream().map(jsonObject -> jsonObject.getInteger("payPrice")).collect(Collectors.toList());
-            return R.ok().put("dates",dates).put("orderCount",orderCount).put("payPrice",payPrice);
+            Map<String, JSONObject> dateMap = new HashMap<>();
+            for (JSONObject jsonObject : jsonObjectList) {
+                dateMap.put(jsonObject.getString("type"), jsonObject);
+            }
+
+            List<String> sortedDates = new ArrayList<>(dateMap.keySet());
+            Collections.sort(sortedDates); // 按日期排序
+
+            List<Integer> orderCount = new ArrayList<>();
+            List<Integer> payPrice = new ArrayList<>();
+            for (String date : sortedDates) {
+                JSONObject jsonObject = dateMap.get(date);
+                if (jsonObject != null) {
+                    orderCount.add(jsonObject.getInteger("orderCount"));
+                    payPrice.add(jsonObject.getInteger("payPrice"));
+                }
+            }
+            return R.ok().put("dates",sortedDates).put("orderCount",orderCount).put("payPrice",payPrice);
         }
         else {
             return R.ok("未查找到数据");
@@ -114,10 +127,24 @@ public class FsStoreStatisticsController extends BaseController
                 beginTime = TimeUtils.formatTime(beginTime);
             }
             List<JSONObject> jsonObjectList = paymentService.selectFsStorePaymentCounts(timeEntity.toMap());
-            List<String> dates = jsonObjectList.stream().map(jsonObject -> jsonObject.getString("type")).collect(Collectors.toList());
-            List<Integer> orderCount = jsonObjectList.stream().map(jsonObject -> jsonObject.getInteger("orderCount")).collect(Collectors.toList());
-            List<Integer> payMoney = jsonObjectList.stream().map(jsonObject -> jsonObject.getInteger("payMoney")).collect(Collectors.toList());
-            return R.ok().put("dates",dates).put("orderCount",orderCount).put("payMoney",payMoney);
+            Map<String, JSONObject> dateMap = new HashMap<>();
+            for (JSONObject jsonObject : jsonObjectList) {
+                dateMap.put(jsonObject.getString("type"), jsonObject);
+            }
+
+            List<String> sortedDates = new ArrayList<>(dateMap.keySet());
+            Collections.sort(sortedDates); // 按日期排序
+
+            List<Integer> orderCount = new ArrayList<>();
+            List<Integer> payMoney = new ArrayList<>();
+            for (String date : sortedDates) {
+                JSONObject jsonObject = dateMap.get(date);
+                if (jsonObject != null) {
+                    orderCount.add(jsonObject.getInteger("orderCount"));
+                    payMoney.add(jsonObject.getInteger("payMoney"));
+                }
+            }
+            return R.ok().put("dates",sortedDates).put("orderCount",orderCount).put("payMoney",payMoney);
         }
         else {
             return R.ok("未查找到数据");

+ 108 - 0
fs-admin/src/main/java/com/fs/store/controller/FsTestReportController.java

@@ -0,0 +1,108 @@
+package com.fs.store.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.store.domain.FsTestReport;
+import com.fs.store.param.FsTestReportParam;
+import com.fs.store.service.IFsTestReportService;
+import com.fs.store.vo.FsTestReportListVO;
+import com.fs.store.vo.FsTestReportVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 测试报告Controller
+ *
+ * @author fs
+ * @date 2023-09-04
+ */
+@RestController
+@RequestMapping("/his/testReport")
+public class FsTestReportController extends BaseController
+{
+    @Autowired
+    private IFsTestReportService fsTestReportService;
+
+    /**
+     * 查询测试报告列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:testReport:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsTestReportParam fsTestReport)
+    {
+        startPage();
+        List<FsTestReportListVO> list = fsTestReportService.selectFsTestReportListVO(fsTestReport);
+        for (FsTestReportListVO vo : list) {
+            vo.setPhone(vo.getPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
+        }
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出测试报告列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:testReport:export')")
+    @Log(title = "测试报告", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsTestReport fsTestReport)
+    {
+        List<FsTestReport> list = fsTestReportService.selectFsTestReportList(fsTestReport);
+        ExcelUtil<FsTestReport> util = new ExcelUtil<FsTestReport>(FsTestReport.class);
+        return util.exportExcel(list, "测试报告数据");
+    }
+
+    /**
+     * 获取测试报告详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:testReport:query')")
+    @GetMapping(value = "/{reportId}")
+    public AjaxResult getInfo(@PathVariable("reportId") Long reportId)
+    {
+        FsTestReportVO  fsTestReportVO = fsTestReportService.selectFsTestReportByReportIdVO(reportId);
+        if (fsTestReportVO.getPhone()!=null){
+            fsTestReportVO.setPhone(fsTestReportVO.getPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
+        }
+        return AjaxResult.success();
+    }
+
+    /**
+     * 新增测试报告
+     */
+    @PreAuthorize("@ss.hasPermi('his:testReport:add')")
+    @Log(title = "测试报告", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsTestReport fsTestReport)
+    {
+        return toAjax(fsTestReportService.insertFsTestReport(fsTestReport));
+    }
+
+    /**
+     * 修改测试报告
+     */
+    @PreAuthorize("@ss.hasPermi('his:testReport:edit')")
+    @Log(title = "测试报告", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsTestReport fsTestReport)
+    {
+
+        return toAjax(fsTestReportService.updateFsTestReport(fsTestReport));
+    }
+
+    /**
+     * 删除测试报告
+     */
+    @PreAuthorize("@ss.hasPermi('his:testReport:remove')")
+    @Log(title = "测试报告", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{reportIds}")
+    public AjaxResult remove(@PathVariable Long[] reportIds)
+    {
+        return toAjax(fsTestReportService.deleteFsTestReportByReportIds(reportIds));
+    }
+}

+ 115 - 0
fs-admin/src/main/java/com/fs/store/controller/FsTestTempController.java

@@ -0,0 +1,115 @@
+package com.fs.store.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.store.domain.FsTestTemp;
+import com.fs.store.service.IFsTestTempService;
+import com.fs.store.vo.OptionsVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 测一测模板Controller
+ *
+ * @author fs
+ * @date 2023-09-04
+ */
+@RestController
+@RequestMapping("/his/testTemp")
+public class FsTestTempController extends BaseController
+{
+    @Autowired
+    private IFsTestTempService fsTestTempService;
+
+    /**
+     * 查询测一测模板列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:testTemp:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsTestTemp fsTestTemp)
+    {
+        startPage();
+        List<FsTestTemp> list = fsTestTempService.selectFsTestTempList(fsTestTemp);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出测一测模板列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:testTemp:export')")
+    @Log(title = "测一测模板", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsTestTemp fsTestTemp)
+    {
+        List<FsTestTemp> list = fsTestTempService.selectFsTestTempList(fsTestTemp);
+        ExcelUtil<FsTestTemp> util = new ExcelUtil<FsTestTemp>(FsTestTemp.class);
+        return util.exportExcel(list, "测一测模板数据");
+    }
+
+    /**
+     * 获取测一测模板详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:testTemp:query')")
+    @GetMapping(value = "/{tempId}")
+    public AjaxResult getInfo(@PathVariable("tempId") Long tempId)
+    {
+        return AjaxResult.success(fsTestTempService.selectFsTestTempByTempId(tempId));
+    }
+
+    /**
+     * 新增测一测模板
+     */
+    @PreAuthorize("@ss.hasPermi('his:testTemp:add')")
+    @Log(title = "测一测模板", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsTestTemp fsTestTemp)
+    {
+
+        fsTestTemp.setTempCode("C"+System.currentTimeMillis());
+        return toAjax(fsTestTempService.insertFsTestTemp(fsTestTemp));
+    }
+
+    /**
+     * 修改测一测模板
+     */
+    @PreAuthorize("@ss.hasPermi('his:testTemp:edit')")
+    @Log(title = "测一测模板", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsTestTemp fsTestTemp)
+    {
+        return toAjax(fsTestTempService.updateFsTestTemp(fsTestTemp));
+    }
+
+    /**
+     * 删除测一测模板
+     */
+    @PreAuthorize("@ss.hasPermi('his:testTemp:remove')")
+    @Log(title = "测一测模板", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{tempIds}")
+    public AjaxResult remove(@PathVariable Long[] tempIds)
+    {
+        return toAjax(fsTestTempService.deleteFsTestTempByTempIds(tempIds));
+    }
+
+
+    @GetMapping("/allList")
+    public TableDataInfo getTestTemp()
+    {
+        List<OptionsVO> list = fsTestTempService.selectAllTestTempList();
+        return getDataTable(list);
+    }
+
+    @GetMapping(value = "/getTempType/{tempId}")
+    public AjaxResult getTempType(@PathVariable("tempId") Long tempId)
+    {
+        return AjaxResult.success(fsTestTempService.selectFsTempTypeByTempId(tempId));
+    }
+
+}

+ 97 - 0
fs-admin/src/main/java/com/fs/store/controller/FsTestTempItemController.java

@@ -0,0 +1,97 @@
+package com.fs.store.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.store.domain.FsTestTempItem;
+import com.fs.store.param.FsTestTempItemParam;
+import com.fs.store.service.IFsTestTempItemService;
+import com.fs.store.vo.FsTestTempItemListVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 模板项目Controller
+ *
+ * @author fs
+ * @date 2023-09-04
+ */
+@RestController
+@RequestMapping("/his/testTempItem")
+public class FsTestTempItemController extends BaseController
+{
+    @Autowired
+    private IFsTestTempItemService fsTestTempItemService;
+
+    /**
+     * 查询模板项目列表
+     */
+
+    @GetMapping("/list")
+    public TableDataInfo list(FsTestTempItemParam fsTestTempItem)
+    {
+        startPage();
+        List<FsTestTempItemListVO> list = fsTestTempItemService.selectFsTestTempItemListVO(fsTestTempItem);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出模板项目列表
+     */
+
+    @Log(title = "模板项目", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsTestTempItem fsTestTempItem)
+    {
+        List<FsTestTempItem> list = fsTestTempItemService.selectFsTestTempItemList(fsTestTempItem);
+        ExcelUtil<FsTestTempItem> util = new ExcelUtil<FsTestTempItem>(FsTestTempItem.class);
+        return util.exportExcel(list, "模板项目数据");
+    }
+
+    /**
+     * 获取模板项目详细信息
+     */
+
+    @GetMapping(value = "/{itemId}")
+    public AjaxResult getInfo(@PathVariable("itemId") Long itemId)
+    {
+        return AjaxResult.success(fsTestTempItemService.selectFsTestTempItemByItemId(itemId));
+    }
+
+    /**
+     * 新增模板项目
+     */
+
+    @Log(title = "模板项目", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsTestTempItem fsTestTempItem)
+    {
+        return toAjax(fsTestTempItemService.insertFsTestTempItem(fsTestTempItem));
+    }
+
+    /**
+     * 修改模板项目
+     */
+
+    @Log(title = "模板项目", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsTestTempItem fsTestTempItem)
+    {
+        return toAjax(fsTestTempItemService.updateFsTestTempItem(fsTestTempItem));
+    }
+
+    /**
+     * 删除模板项目
+     */
+    @Log(title = "模板项目", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{itemIds}")
+    public AjaxResult remove(@PathVariable Long[] itemIds)
+    {
+        return toAjax(fsTestTempItemService.deleteFsTestTempItemByItemIds(itemIds));
+    }
+}

+ 5 - 3
fs-admin/src/main/java/com/fs/store/controller/FsUserController.java

@@ -4,7 +4,8 @@ import java.util.List;
 
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.ParseUtils;
-import com.fs.store.vo.FSUserVO;
+import com.fs.store.vo.FsUserListVO;
+import com.fs.store.vo.FsUserVO;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -38,9 +39,10 @@ public class FsUserController extends BaseController
     public TableDataInfo list(FsUser fsUser)
     {
         startPage();
-        List<FSUserVO> list = fsUserService.selectFsUserVOList(fsUser);
-        for (FSUserVO vo : list){
+        List<FsUserListVO> list = fsUserService.selectFsUserVOList(fsUser);
+        for (FsUserListVO vo : list){
             vo.setPhone(ParseUtils.parsePhone(vo.getPhone()));
+            vo.setSpreadPhone(ParseUtils.parsePhone(vo.getSpreadPhone()));
         }
         return getDataTable(list);
     }

+ 124 - 0
fs-admin/src/main/java/com/fs/store/controller/FsVesselController.java

@@ -0,0 +1,124 @@
+package com.fs.store.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.store.domain.FsVessel;
+import com.fs.store.service.IFsVesselService;
+import com.fs.store.vo.FsVesselListVO;
+import com.fs.store.vo.OptionsVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 经络管理Controller
+ *
+ * @author fs
+ * @date 2023-10-23
+ */
+@RestController
+@RequestMapping("/his/vessel")
+public class FsVesselController extends BaseController
+{
+    @Autowired
+    private IFsVesselService fsVesselService;
+
+    /**
+     * 查询经络管理列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:vessel:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsVessel fsVessel)
+    {
+        startPage();
+        List<FsVesselListVO> list = fsVesselService.selectFsVesselListVO(fsVessel);
+        return getDataTable(list);
+    }
+
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<FsVessel> util = new ExcelUtil<>(FsVessel.class);
+        return util.importTemplateExcel("导入模板");
+    }
+
+
+    @Log(title = "导入", businessType = BusinessType.IMPORT)
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<FsVessel> util = new ExcelUtil<>(FsVessel.class);
+        List<FsVessel> list = util.importExcel(file.getInputStream());
+        String message = fsVesselService.importData(list);
+        return AjaxResult.success(message);
+    }
+    /**
+     * 导出经络管理列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:vessel:export')")
+    @Log(title = "经络管理", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsVessel fsVessel)
+    {
+        List<FsVessel> list = fsVesselService.selectFsVesselList(fsVessel);
+        ExcelUtil<FsVessel> util = new ExcelUtil<FsVessel>(FsVessel.class);
+        return util.exportExcel(list, "经络管理数据");
+    }
+
+    /**
+     * 获取经络管理详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:vessel:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(fsVesselService.selectFsVesselById(id));
+    }
+
+    /**
+     * 新增经络管理
+     */
+    @PreAuthorize("@ss.hasPermi('his:vessel:add')")
+    @Log(title = "经络管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsVessel fsVessel)
+    {
+        return toAjax(fsVesselService.insertFsVessel(fsVessel));
+    }
+
+    /**
+     * 修改经络管理
+     */
+    @PreAuthorize("@ss.hasPermi('his:vessel:edit')")
+    @Log(title = "经络管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsVessel fsVessel)
+    {
+        return toAjax(fsVesselService.updateFsVessel(fsVessel));
+    }
+
+    /**
+     * 删除经络管理
+     */
+    @PreAuthorize("@ss.hasPermi('his:vessel:remove')")
+    @Log(title = "经络管理", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fsVesselService.deleteFsVesselByIds(ids));
+    }
+
+    @GetMapping("/allList")
+    public AjaxResult getAllList()
+    {
+        List<OptionsVO> list = fsVesselService.selectFsVesselListOptions();
+        return  AjaxResult.success(list);
+    }
+}

+ 242 - 9
fs-admin/src/main/java/com/fs/task/StoreTask.java

@@ -1,46 +1,71 @@
 package com.fs.task;
 
 
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.event.TemplateBean;
+import com.fs.common.event.TemplateEvent;
+import com.fs.common.event.TemplateListenEnum;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyService;
+import com.fs.core.security.SecurityUtils;
 import com.fs.crm.mapper.CrmCustomerMapper;
 import com.fs.erp.domain.ErpDeliverys;
+import com.fs.erp.domain.ErpGoods;
+import com.fs.erp.domain.ErpOrderItem;
 import com.fs.erp.domain.ErpOrderQuery;
-import com.fs.erp.dto.ErpOrderQueryRequert;
-import com.fs.erp.dto.ErpOrderQueryResponse;
+import com.fs.erp.dto.*;
+import com.fs.erp.service.IErpGoodsService;
 import com.fs.erp.service.IErpOrderService;
+import com.fs.huifuPay.domain.HuiFuCreateOrder;
+import com.fs.huifuPay.domain.HuifuCreateOrderResult;
+import com.fs.huifuPay.service.HuiFuService;
+import com.fs.pay.pay.domain.CreateWxOrderResult;
 import com.fs.pay.pay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
+import com.fs.pay.pay.dto.WxJspayDTO;
 import com.fs.pay.pay.service.PayService;
 import com.fs.pay.pay.service.impl.PayApiServiceImpl;
-import com.fs.store.domain.FsStoreAfterSales;
-import com.fs.store.domain.FsStoreOrder;
-import com.fs.store.domain.FsStoreOrderItem;
-import com.fs.store.domain.FsStorePayment;
+import com.fs.store.config.StoreConfig;
+import com.fs.store.domain.*;
 import com.fs.store.dto.ExpressInfoDTO;
 import com.fs.store.dto.FsStoreCartDTO;
+import com.fs.store.dto.StoreProductGroupDTO;
+import com.fs.store.enums.OrderInfoEnum;
+import com.fs.store.enums.OrderLogEnum;
 import com.fs.store.enums.ShipperCodeEnum;
-import com.fs.store.mapper.FsStoreOrderItemMapper;
-import com.fs.store.mapper.FsStoreOrderMapper;
-import com.fs.store.mapper.FsStorePaymentMapper;
+import com.fs.store.mapper.*;
 import com.fs.store.param.*;
 import com.fs.store.service.*;
 import com.fs.store.vo.FsStoreOrderItemVO;
 import com.fs.store.vo.FsStoreOrderTuiVO;
 import com.fs.store.vo.FsStoreOrderVO;
+import com.fs.store.vo.FsUserShareVO;
+import com.fs.system.service.ISysConfigService;
+import com.sun.media.sound.SF2GlobalRegion;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.annotations.Param;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
 import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 import static com.fs.store.constants.StoreConstants.DELIVERY;
 
@@ -52,6 +77,7 @@ import static com.fs.store.constants.StoreConstants.DELIVERY;
 @Component("storeTask")
 public class StoreTask
 {
+    Logger logger =  LoggerFactory.getLogger(StoreTask.class);
     @Autowired
     private RedisTemplate redisTemplate;
     @Autowired
@@ -84,6 +110,23 @@ public class StoreTask
 
     @Autowired
     private CrmCustomerMapper crmCustomerMapper;
+    @Autowired
+    private IErpGoodsService goodsService;
+    @Autowired
+    private ApplicationEventPublisher publisher;
+
+    public void tt()
+    {
+        ErpGoodsStockQueryRequert request=new ErpGoodsStockQueryRequert();
+        request.setBarcode("105201");
+        ErpGoodsStockQueryResponse response=goodsService.getGoodsStock(request);
+        ErpGoodsQueryRequert erpGoodsQueryRequert = new ErpGoodsQueryRequert();
+        erpGoodsQueryRequert.setCode("105201");
+        ErpGoodsQueryResponse goods = goodsService.getGoods(erpGoodsQueryRequert);
+
+        System.out.println(goods);
+        System.out.println(response);
+    }
 
     //每5分钟执行一次
     public void deliveryOp()
@@ -113,6 +156,151 @@ public class StoreTask
 
     }
 
+    @Autowired
+    FsUserTuiMoneyRankMapper fsUserTuiMoneyRankMapper;
+
+    private FsUserAddressMapper addressMapper;
+    public void addUserTuiMoneyRank(){
+        List<FsUserShareVO> fsUserShareVOS1 = fsUserTuiMoneyRankMapper.selectFsUserTuiMoneyRankByType(1);
+        fsUserTuiMoneyRankMapper.deleteFsUserTuiMoneyRankByType(1);
+        Long id=1L;
+        int rank=1;
+        for (FsUserShareVO vo : fsUserShareVOS1) {
+            FsUserTuiMoneyRank userRank = new FsUserTuiMoneyRank();
+            userRank.setAvatar(vo.getAvatar());
+            userRank.setUserId(vo.getUserId());
+            userRank.setTuiMoney(vo.getTuiMoney());
+            userRank.setType(1);
+            userRank.setId(id);
+            userRank.setSort(rank);
+            userRank.setNickname(vo.getNickname());
+            userRank.setPhone(vo.getPhone());
+            fsUserTuiMoneyRankMapper.insertFsUserTuiMoneyRank(userRank);
+            rank++;
+            id++;
+        }
+
+
+        List<FsUserShareVO> fsUserShareVOS2 = fsUserTuiMoneyRankMapper.selectFsUserTuiMoneyRankByType(2);
+        fsUserTuiMoneyRankMapper.deleteFsUserTuiMoneyRankByType(2);
+        rank=1;
+        for (FsUserShareVO vo : fsUserShareVOS2) {
+            FsUserTuiMoneyRank userRank = new FsUserTuiMoneyRank();
+            userRank.setAvatar(vo.getAvatar());
+            userRank.setUserId(vo.getUserId());
+            userRank.setSort(rank);
+            userRank.setTuiMoney(vo.getTuiMoney());
+            userRank.setType(2);
+            userRank.setId(id);
+            userRank.setNickname(vo.getNickname());
+            userRank.setPhone(vo.getPhone());
+            fsUserTuiMoneyRankMapper.insertFsUserTuiMoneyRank(userRank);
+            rank++;
+            id++;
+        }
+        List<FsUserShareVO> fsUserShareVOS3 = fsUserTuiMoneyRankMapper.selectFsUserTuiMoneyRankByType(3);
+        fsUserTuiMoneyRankMapper.deleteFsUserTuiMoneyRankByType(3);
+        rank=1;
+        for (FsUserShareVO vo : fsUserShareVOS3) {
+            FsUserTuiMoneyRank userRank = new FsUserTuiMoneyRank();
+            userRank.setAvatar(vo.getAvatar());
+            userRank.setUserId(vo.getUserId());
+            userRank.setSort(rank);
+            userRank.setTuiMoney(vo.getTuiMoney());
+            userRank.setType(3);
+            userRank.setId(id);
+            userRank.setNickname(vo.getNickname());
+            userRank.setPhone(vo.getPhone());
+            fsUserTuiMoneyRankMapper.insertFsUserTuiMoneyRank(userRank);
+            rank++;
+            id++;
+        }
+    }
+
+    @Autowired
+    IErpGoodsService erpGoodsService;
+    @Autowired
+    ISysConfigService configService;
+    @Autowired
+    private FsStoreProductAttrValueMapper fsStoreProductAttrValueMapper;
+
+    @Autowired
+    private IFsStoreProductGroupService storeProductGroupService;
+
+    public void storeProdUpdateCostPrice()
+    {
+        String json=configService.selectConfigByKey("store.config");
+        StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
+        List<FsStoreProductAttrValue> values = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueList(new FsStoreProductAttrValue());
+        int i=0;
+        for (FsStoreProductAttrValue value : values) {
+            try {
+                if (StringUtils.isNotEmpty(value.getBarCode())){
+                    ErpGoodsQueryRequert query = new ErpGoodsQueryRequert();
+                    query.setCode(value.getBarCode());
+                    ErpGoodsQueryResponse goods = erpGoodsService.getGoods(query);
+                    List<ErpGoods> items = goods.getItems();
+                    if (items!=null&&items.size()>0){
+                        ErpGoods erpGoods = items.get(0);
+                        BigDecimal salesPrice = erpGoods.getSales_price();
+                        if (salesPrice!=null&&salesPrice.compareTo(BigDecimal.ZERO) != 0){
+                            BigDecimal divide = salesPrice.multiply(new BigDecimal(config.getSalesPriceRate())).divide(new BigDecimal("100"));
+                            logger.info("商品id"+value.getId()+"商品成本:"+salesPrice+"代理价"+divide);
+                            FsStoreProductAttrValue va = new FsStoreProductAttrValue();
+                            va.setCost(salesPrice);
+                            va.setPrice(divide);
+                            va.setId(value.getId());
+                            fsStoreProductAttrValueMapper.updateFsStoreProductAttrValue(va);
+                            i++;
+                        }
+                    }
+                }else
+                if(StringUtils.isNotEmpty(value.getGroupBarCode())){
+                    FsStoreProductGroup group=storeProductGroupService.selectFsStoreProductGroupByBarCode(value.getGroupBarCode());
+                    if(group!=null){
+                        JSONArray jsonArray=JSONUtil.parseArray(group.getProducts());
+                        List<StoreProductGroupDTO> productGroupDTOS=JSONUtil.toList(jsonArray, StoreProductGroupDTO.class);
+                        if(productGroupDTOS!=null){
+                            for(StoreProductGroupDTO dto:productGroupDTOS){
+                                FsStoreProductAttrValue attrValue=fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueById(dto.getId());
+                                Integer count = dto.getCount();
+                                String barCode = attrValue.getBarCode();
+                                ErpGoodsQueryRequert query = new ErpGoodsQueryRequert();
+                                query.setCode(barCode);
+                                ErpGoodsQueryResponse goods = erpGoodsService.getGoods(query);
+                                List<ErpGoods> items = goods.getItems();
+                                if (items!=null&&items.size()>0){
+                                    ErpGoods erpGoods = items.get(0);
+                                    BigDecimal salesPrice = erpGoods.getSales_price();
+                                    if (salesPrice!=null&&salesPrice.compareTo(BigDecimal.ZERO) != 0){
+                                        salesPrice=salesPrice.multiply(new BigDecimal(count));
+                                        BigDecimal divide = salesPrice.multiply(new BigDecimal(config.getSalesPriceRate())).divide(new BigDecimal("100"));
+                                        logger.info("商品id"+value.getId()+"商品成本:"+salesPrice+"代理价"+salesPrice);
+                                        FsStoreProductAttrValue va = new FsStoreProductAttrValue();
+                                        va.setCost(salesPrice);
+                                        va.setAgentPrice(divide);
+                                        va.setId(value.getId());
+                                        fsStoreProductAttrValueMapper.updateFsStoreProductAttrValue(va);
+                                        i++;
+                                    }
+                                }
+
+                            }
+                        }
+                    }
+
+                }
+            }catch (Exception e){
+                logger.info("商品更新成本价错误:"+value.getId());
+            }
+
+
+
+        }
+        logger.info("更新商品成本价:"+i);
+
+
+    }
     public void couponOp()
     {
         couponUserService.updateFsCouponByExpire();
@@ -317,9 +505,54 @@ public class StoreTask
         }
     }
 
+
+
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
+    public void updateCompanyUserStatus()
+    {
+        CompanyUser user = new CompanyUser();
+        user.setStatus("0");
+        user.setDelFlag("0");
+        List<CompanyUser> companyUsers = companyUserMapper.selectCompanyUserList(user);
+        for (CompanyUser companyUser : companyUsers) {
+            if(SecurityUtils.matchesPassword("123456", companyUser.getPassword())){
+                companyUser.setStatus("1");
+                companyUserMapper.updateCompanyUser(companyUser);
+                logger.info("密码为123456 停用账号:"+companyUser.getUserId()+":"+companyUser.getNickName());
+            }
+        }
+    }
+
     public  void deleteCustomer(){
 
     }
+    @Autowired
+    private IFsStoreOrderStatusService orderStatusService;
+    public  void updateExpress(){
+        List<FsStoreOrder> list = fsStoreOrderMapper.selectUpdateExpress();
+        for (FsStoreOrder order : list){
+                ErpOrderQueryRequert request = new ErpOrderQueryRequert();
+                request.setCode(order.getExtendOrderId());
+                ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+                if(response.getOrders()!=null&&response.getOrders().size()>0){
+                    for(ErpOrderQuery orderQuery : response.getOrders()){
+                        if(orderQuery.getDeliverys()!=null&&orderQuery.getDeliverys().size()>0){
+                            for(ErpDeliverys delivery:orderQuery.getDeliverys()){
+                                if(delivery.getDelivery()&&StringUtils.isNotEmpty(delivery.getMail_no())){
+                                    //更新商订单状态 删除REDIS
+                                    orderService.deliveryOrder(order.getOrderCode(),delivery.getMail_no(),delivery.getExpress_code(),delivery.getExpress_name());
+                                    redisCache.deleteObject(DELIVERY+":"+order.getExtendOrderId());
+                                }
+                            }
+
+                        }
+                    }
+
+            }
+
+        }
+    }
 
 
 

+ 11 - 13
fs-admin/src/main/java/com/fs/third/controller/FeiyuCustomerController.java

@@ -76,15 +76,6 @@ public class FeiyuCustomerController extends BaseController {
         return getAccessToken(crmCustomerThird,authCode);
     }
 
-
-    public String getAccessTokenStr(CrmCustomerThird crmCustomerThird){
-        R accessToken=getAccessToken(crmCustomerThird,"");
-        crmCustomerThird= (CrmCustomerThird) accessToken.get("thirds");
-        return crmCustomerThird.getAccessToken();
-    }
-
-
-
     public R getAccessToken(CrmCustomerThird crmCustomerThird,String authCode){
         if(StringUtils.isEmpty(crmCustomerThird.getRefreshToken())){
             return getAccessTokenAct(crmCustomerThird,authCode);
@@ -110,6 +101,13 @@ public class FeiyuCustomerController extends BaseController {
     }
 
 
+    public String getAccessToken(CrmCustomerThird crmCustomerThird){
+         R accessToken=getAccessToken(crmCustomerThird,"");
+         crmCustomerThird= (CrmCustomerThird) accessToken.get("thirds");
+         return crmCustomerThird.getAccessToken();
+    }
+
+
     public R getAccessTokenAct(CrmCustomerThird crmCustomerThird,String authCode){
         try {
             JSONObject jsonObject = new JSONObject();
@@ -141,7 +139,7 @@ public class FeiyuCustomerController extends BaseController {
                 crmCustomerThird.setStatus(1L);//设置授权状态
 
                 //获取授权账户信息
-                postStr = HttpUtils.sendGetWithToken(open_api_url_prefix+"2/user/info/","",getAccessTokenStr(crmCustomerThird));
+                postStr = HttpUtils.sendGetWithToken(open_api_url_prefix+"2/user/info/","",getAccessToken(crmCustomerThird));
                 obj = JSONObject.parseObject(postStr);
                 data = obj.getJSONObject("data");
                 String display_name= data.getString("display_name");
@@ -205,7 +203,7 @@ public class FeiyuCustomerController extends BaseController {
     public R getAdvertisers(@RequestBody CrmCustomerThird crmCustomerThird){
         try {
 
-            String paramStr= "app_id=" + crmCustomerThird.getAppId() + "&secret="+crmCustomerThird.getAppSecret()+"&access_token="+getAccessTokenStr(crmCustomerThird);
+            String paramStr= "app_id=" + crmCustomerThird.getAppId() + "&secret="+crmCustomerThird.getAppSecret()+"&access_token="+getAccessToken(crmCustomerThird);
             String postStr = HttpUtils.sendGet(open_api_url_prefix+"oauth2/advertiser/get/",paramStr);
             JSONObject obj = JSONObject.parseObject(postStr);
             Integer code= obj.getInteger("code");
@@ -246,7 +244,7 @@ public class FeiyuCustomerController extends BaseController {
         try {
 
             String paramStr= "advertiser_id=" + advertiserId;
-            String postStr = HttpUtils.sendGetWithToken(open_api_url_prefix+"2/majordomo/advertiser/select/",paramStr,getAccessTokenStr(crmCustomerThird));
+            String postStr = HttpUtils.sendGetWithToken(open_api_url_prefix+"2/majordomo/advertiser/select/",paramStr,getAccessToken(crmCustomerThird));
             JSONObject obj = JSONObject.parseObject(postStr);
             Integer code= obj.getInteger("code");
             String message=obj.getString("message");
@@ -299,7 +297,7 @@ public class FeiyuCustomerController extends BaseController {
                 paramStr+=("&end_time="+crmCustomerThird.getEndTime());
             }
             paramStr=paramStr.replace(" ", "%20");
-            String postStr = HttpUtils.sendGetWithToken(open_api_url_prefix+"2/tools/clue/get/", paramStr,getAccessTokenStr(crmCustomerThird));
+            String postStr = HttpUtils.sendGetWithToken(open_api_url_prefix+"2/tools/clue/get/", paramStr,getAccessToken(crmCustomerThird));
             JSONObject obj = JSONObject.parseObject(postStr);
             Integer code= obj.getInteger("code");
             String message=obj.getString("message");

Разница между файлами не показана из-за своего большого размера
+ 2 - 1
fs-api/src/main/java/com/fs/app/controller/CommonController.java


+ 22 - 5
fs-api/src/main/java/com/fs/app/controller/PayController.java

@@ -11,6 +11,7 @@ import com.fs.common.core.redis.RedisCache;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.erp.service.IErpOrderService;
+import com.fs.huifuPay.domain.HuiFuResult;
 import com.fs.pay.pay.domain.OrderCallback;
 import com.fs.pay.pay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
@@ -28,10 +29,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
@@ -84,7 +82,7 @@ public class PayController {
 
     @ApiOperation("易宝第三方支付回调")
     @PostMapping(value="/ybPayNotify")
-    public String ybPayNotify(@RequestBody String jsonBody) throws Exception {
+    public String ybPayNotify( @RequestBody String jsonBody ) throws Exception {
         //验证
         OrderCallback o= JSONUtil.toBean(jsonBody, OrderCallback.class);
         if(o.getState().equals("0")){
@@ -104,7 +102,26 @@ public class PayController {
         return "";
 
     }
+    @ApiOperation("汇付第三方支付回调")
+    @PostMapping(value="/hfPayNotify")
+    public String hfPayNotify(@RequestParam String resp_desc, @RequestParam String resp_code, @RequestParam String sign, @RequestParam String resp_data) throws Exception {
+        //验证
+        HuiFuResult o = JSON.parseObject(resp_data, HuiFuResult.class);
+        logger.info("汇付支付回调:"+o);
+        if(o.getResp_code().equals("00000000")){
+            String[] order=o.getReq_seq_id().split("-");
+            switch (order[0]) {
+                case "store":
+                    return orderService.payConfirm(1,null,order[1], o.getHf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
+                case "store_remain":
+                    return orderService.payRemainConfirm( order[1], o.getHf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
+                case "payment":
+                    return storePaymentService.payConfirm(order[1],o.getHf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
+            }
 
+        }
+        return "ok";
+    }
 
 
     @ApiOperation("小雨点第三方支付回调")

+ 0 - 2
fs-common/src/main/java/com/fs/common/config/FSSysConfig.java

@@ -29,8 +29,6 @@ public class FSSysConfig
     String actId;
     String appId;
     String manuId;
-    String accessKeyID;
-    String accessKeySecret;
     String callbackUrl;
     //erp接口
     Integer erpOpen;//是否开启ERP

+ 0 - 47
fs-company-app/src/main/java/com/fs/wx/cp/config/QywxCacheConfig.java

@@ -1,47 +0,0 @@
-package com.fs.wx.cp.config;
-
-
-import org.springframework.stereotype.Component;
-
-@Component
-public class QywxCacheConfig {
-
-    private String keyPrefix="tobdev-";
-    private String suitTicket="suite-ticket";
-    private String qrLogin="qywx_login";
-    private String qrLoginDuration="600";
-
-    private String getKeyPrefix() {
-        return keyPrefix;
-    }
-
-    private void setKeyPrefix(String keyPrefix) {
-        this.keyPrefix = keyPrefix;
-    }
-
-    public String getSuitTicket() {
-
-        return keyPrefix+suitTicket;
-    }
-
-    public void setSuitTicket(String suitTicket) {
-        this.suitTicket = suitTicket;
-    }
-
-    public String getQrLogin(String companyId) {
-        return keyPrefix+companyId;
-    }
-
-    public void setQrLogin(String qrLogin) {
-        this.qrLogin = qrLogin;
-    }
-
-    public String getQrLoginDuration() {
-        return qrLoginDuration;
-    }
-
-    public void setQrLoginDuration(String qrLoginDuration) {
-        this.qrLoginDuration = qrLoginDuration;
-    }
-
-}

+ 0 - 133
fs-company-app/src/main/java/com/fs/wx/cp/config/QywxThirdConfig.java

@@ -1,133 +0,0 @@
-package com.fs.wx.cp.config;
-
-import lombok.Data;
-import org.springframework.stereotype.Component;
-@Data
-@Component
-public class QywxThirdConfig {
-
-    private String corpId="ww7e678b3a218cca5c";
-    private String providerSecret="-Q3FfaJ0SYGccuGe6JX8ZxaniOlexG8-B6UifGgQZO459weFsL0FJhAkyQaXggwI";
-    private String suiteId="ww4c5b9f15f6250338";
-    private String suiteSecret ="kQ0wP9u_4xeD3poycV9V2sar0K6ooekNvXfF5LUptP8";
-    private String token ="5lUCAtKF";
-    private String encodingAESKey ="UJfTQ5qKTKlegjkXtp1YuzJzxeHlUKvq5GyFbERN1iU";
-    private Integer authType;
-    private String templateId;
-    private String approvalFlowId;
-    private String baseUrl = "https://qyapi.weixin.qq.com/cgi-bin/";
-    //获取部门id
-    private String departmentID = baseUrl+"/department/simplelist?access_token=%s";
-    //获取部门所有用户信息
-    private String departmentUser = baseUrl+"/user/list?access_token=%s&department_id=%s";
-    //获取部门用户id列表
-    private String departmentInfo = baseUrl+"/department/get?access_token=%s&id=%s";
-    //服务商相关
-    private String serviceUrl = baseUrl+"service/";
-    private String suiteTokenUrl = serviceUrl+"get_suite_token";
-    private String preAuthCodeUrl = serviceUrl+"get_pre_auth_code?suite_access_token=%s";
-    private String permanentCodeUrl = serviceUrl+"get_permanent_code?suite_access_token=%s";
-    private String sessionInfoUrl = serviceUrl+"set_session_info?suite_access_token=%s";
-    private String installUrl = "https://open.work.weixin.qq.com/3rdapp/install?suite_id=%s&pre_auth_code=%s&redirect_uri=%s&state=STATE";
-
-    private String providerTokenUlr = serviceUrl+"get_provider_token";
-    private String registerCodeUrl = serviceUrl+ "get_register_code?provider_access_token=%s";
-    private String registerUrl =  "https://open.work.weixin.qq.com/3rdservice/wework/register?register_code=%s";
-
-
-    private String ssoAuthUrl = "https://open.work.weixin.qq.com/wwopen/sso/3rd_qrConnect?appid=%s&redirect_uri=%s&state=%s&usertype=%s";
-    private String loginInfoUrl = serviceUrl+"get_login_info?access_token=%s";
-
-    //通讯录转译
-    private String contactUploadUrl = serviceUrl+"media/upload?provider_access_token=%s&type=%s";
-    private String contactTransUrl = serviceUrl + "contact/id_translate?provider_access_token=%s";
-    private String transResultUrl = serviceUrl + "batch/getresult?provider_access_token=%s&jobid=%s";
-
-    //公司相关
-    private String corpTokenUrl = serviceUrl+"get_corp_token?suite_access_token=%s";
-    private String departmentUrl = baseUrl+"department/list?access_token=%s";
-    private String userSimplelistUrl = baseUrl+"user/simplelist?access_token=%s&department_id=%s&fetch_child=%s";
-    private String userDetailUrl = baseUrl+"user/get?access_token={access_token}&userid={user_id}";
-
-    //外部联系人
-
-    //获取配置了客户联系功能的成员列表 https://work.weixin.qq.com/api/doc/90001/90143/92576
-    private String extContactFollowUserListUrl = baseUrl+"externalcontact/get_follow_user_list?access_token=%s";
-    //获取客户列表  https://work.weixin.qq.com/api/doc/90001/90143/92264
-    private String extContactListUrl = baseUrl+"externalcontact/list?access_token=%s&userid=%s";
-    //获取客户详细信息  https://work.weixin.qq.com/api/doc/90001/90143/92264
-    private String extContactInfoUrl = baseUrl+"externalcontact/get?access_token=%s&external_userid=%s&cursor=%s";
-    //获取客户详细信息列表  https://work.weixin.qq.com/api/doc/90001/90143/92264
-    private String extContactInfoListUrl = baseUrl+"/externalcontact/batch/get_by_user?access_token=%s";
-    //修改客户备注信息  https://work.weixin.qq.com/api/doc/90001/90143/92264
-    private String updateExtContactInfoListUrl = baseUrl+"/externalcontact/remark?access_token=%s";
-
-    //获取企业标签库
-    private String CorpTagListUrl = baseUrl+"/externalcontact/get_corp_tag_list?access_token=%s";
-
-
-    //获取客户群列表 https://work.weixin.qq.com/api/doc/90001/90143/93414
-    private String extContactGroupchatUrl = baseUrl+"externalcontact/groupchat/list?access_token=%s";
-    //消息推送
-    private String messageSendUrl= baseUrl+"message/send?access_token=%s";
-    //素材管理
-    //https://open.work.weixin.qq.com/api/doc/90001/90143/90389
-    //type	是	媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file)
-    private String mediaUploadUrl = baseUrl+"media/upload?access_token=%s&type=%s";
-    private String mediaUploadimgUrl = baseUrl+"media/uploadimg?access_token=%s";
-    private String mediaGetUrl = baseUrl+"media/get?access_token=%s&media_id=%s";
-    private String mediaGetJssdkUrl = baseUrl+"media/get/jssdk?access_token=%s&media_id=%s";
-    //审批
-    //审批应用 https://work.weixin.qq.com/api/doc/90001/90143/91956
-    private String oaCopyTemplateUrl ="oa/approval/copytemplate?access_token=%s";
-    private String oaGetTemplateUrl ="/oa/gettemplatedetail?access_token=%s";
-    private String oaApplyEventUrl = "oa/applyevent?access_token=%s";
-    private String oaGetApprovalUrl ="oa/getapprovaldetail?access_token=%s";
-
-    //审批流程引擎 https://work.weixin.qq.com/api/doc/90001/90143/93798
-    private String openApprovalDataUrl = baseUrl+"corp/getopenapprovaldata?access_token=ACCESS_TOKEN";
-
-
-    // H5应用
-    //scope应用授权作用域。
-    //snsapi_base:静默授权,可获取成员的基础信息(UserId与DeviceId);
-    //snsapi_userinfo:静默授权,可获取成员的详细信息,但不包含手机、邮箱等敏感信息;
-    //snsapi_privateinfo:手动授权,可获取成员的详细信息,包含手机、邮箱等敏感信息(已不再支持获取手机号/邮箱)。
-    //https://work.weixin.qq.com/api/doc/90001/90143/91120
-    private String oauthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect";
-    //https://work.weixin.qq.com/api/doc/90001/90143/91121
-    private String oauthUserUrl = serviceUrl+"getuserinfo3rd?suite_access_token=%s&code=%s";
-    //https://work.weixin.qq.com/api/doc/90001/90143/91122
-    private String oauthUserDetailUrl = serviceUrl+"getuserdetail3rd?suite_access_token=%s";
-    //https://work.weixin.qq.com/api/doc/90001/90144/90539
-    private String jsapiTicketUrl = baseUrl+"get_jsapi_ticket?access_token=%s";
-    //https://work.weixin.qq.com/api/doc/90001/90144/90539#%E8%8E%B7%E5%8F%96%E5%BA%94%E7%94%A8%E7%9A%84jsapi_ticket
-    private String jsapiTicketAgentUrl = baseUrl+"ticket/get?access_token=%s&type=agent_config";
-
-    //家校沟通
-    //https://open.work.weixin.qq.com/api/doc/90001/90143/92291
-    private String extContactMessageSendUrl = baseUrl+"externalcontact/message/send?access_token=%s";
-
-    //此oauth与H5oauth一致  https://work.weixin.qq.com/api/doc/90001/90143/91861
-    private String schoolOauthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect";
-    //https://work.weixin.qq.com/api/doc/90001/90143/91711
-    private String schoolOauthUserUrl = serviceUrl+"getuserinfo3rd?suite_access_token=%s&code=%s";
-
-    private String schoolUrl = baseUrl+"school/";
-    //https://work.weixin.qq.com/api/doc/90001/90143/92038
-    private String schoolUserGetUrl = schoolUrl+"user/get?access_token=%s&userid=%s";
-    //https://work.weixin.qq.com/api/doc/90001/90143/92299
-    private String schoolDepartmentListUrl = schoolUrl+"department/list?access_token=%s&id=%s";
-    //https://work.weixin.qq.com/api/doc/90001/90143/92043
-    private String schoolUserListUrl = schoolUrl+"user/list?access_token=%s&department_id=%s&fetch_child=%s";
-
-
-
-    //小程序应用
-    //小程序登录流程 https://work.weixin.qq.com/api/doc/90001/90144/92427
-    //code2Session https://work.weixin.qq.com/api/doc/90001/90144/92423
-    private String code2sessionUrl = serviceUrl+"miniprogram/jscode2session?suite_access_token=%s&js_code=%s&grant_type=authorization_code";
-
-
-
-}

+ 0 - 97
fs-company-app/src/main/java/com/fs/wx/cp/controller/MpController.java

@@ -1,97 +0,0 @@
-package com.fs.wx.cp.controller;
-import com.fs.wx.cp.service.QywxThirdService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-//企业微信校验 回调
-@RestController
-public class MpController {
-
-//    private static WXBizMsgCrypt wxBizMsgCrypt;
-    @Autowired
-    private  QywxThirdService qywxThirdService;
-//    {
-//        try {
-//            wxBizMsgCrypt = new WXBizMsgCrypt("5lUCAtKF", "UJfTQ5qKTKlegjkXtp1YuzJzxeHlUKvq5GyFbERN1iU", "ww7e678b3a218cca5c");
-//        } catch (AesException e) {
-//            e.printStackTrace();
-//        }
-//    }
-
-
-
-    /**
-     * 功能描述:
-     * 应用详情 --> 回调配置中 --> 数据回调URL
-     */
-    @GetMapping("/data")
-    public String data(@RequestParam("msg_signature") String msg_signature,
-                       @RequestParam("timestamp") String timestamp,
-                       @RequestParam("nonce") String nonce,
-                       @RequestParam("echostr") String echostr) {
-        System.out.println("数据回调URL-微信调用dataGet请求");
-        return qywxThirdService.getVerify(msg_signature, timestamp, nonce, echostr);
-    }
-
-    @GetMapping("/com")
-    public String com(@RequestParam("msg_signature") String msg_signature,
-                       @RequestParam("timestamp") String timestamp,
-                       @RequestParam("nonce") String nonce,
-                       @RequestParam("echostr") String echostr
-    ) {
-        System.out.println("数据回调URL-微信调用com Get");
-
-        return qywxThirdService.getVerify(msg_signature, timestamp, nonce, echostr);
-    }
-    @PostMapping ("/data")
-    public String pdata(@RequestBody String requestBody,
-                        @RequestParam("msg_signature") String msg_signature,
-                        @RequestParam("timestamp") String timestamp,
-                        @RequestParam(value = "corpid", required = false) String corpid,
-                        @RequestParam("nonce") String nonce) {
-        System.out.println("数据回调URL-dataPost");
-        String s = qywxThirdService.dataCallback(msg_signature,timestamp,nonce,requestBody);
-        return "success";
-    }
-    @PostMapping("/com")
-    public String pcom(@RequestBody String requestBody,
-                       @RequestParam("msg_signature") String msg_signature,
-                      @RequestParam("timestamp") String timestamp,
-                      @RequestParam("nonce") String nonce
-                        ){
-        System.out.println("数据回调URL-微信调用com post");
-        String s = qywxThirdService.instructCallback(msg_signature,timestamp,nonce,requestBody);
-        return "success";
-    }
-
-
-//    /**
-//     * 功能描述:
-//     * 配置回调时调用 该接口进行url校验 解密echostr明文返回
-//     *
-//     */
-//    private String verifyUrl(String msg_signature, String timestamp, String nonce, String echostr) {
-//        try {
-//            System.err.println(msg_signature + "-|-" + timestamp + "-|-" + nonce + "-|-" + echostr);
-//            String s = wxBizMsgCrypt.VerifyURL(msg_signature, timestamp, nonce, echostr);
-//            System.out.println(s);
-//            return s;
-//        } catch (AesException e) {
-//            e.printStackTrace();
-//        }
-//        return null;
-//    }
-
-
-//    /**
-//     * 功能描述:
-//     * 应用详情 --> 使用配置 --> 业务设置URL
-//     */
-//    @RequestMapping("/service")
-//    public String service(@RequestParam("msg_signature") String msg_signature,
-//                          @RequestParam("timestamp") String timestamp,
-//                          @RequestParam("nonce") String nonce,
-//                          @RequestParam("echostr") String echostr) {
-//        System.out.println("业务设置URL-微信调用我了");
-//        return verifyUrl(msg_signature, timestamp, nonce, echostr);
-//    }
-}

+ 0 - 85
fs-company-app/src/main/java/com/fs/wx/cp/controller/WxPortalController.java

@@ -1,85 +0,0 @@
-package com.fs.wx.cp.controller;
-
-import com.fs.wx.cp.config.WxCpConfiguration;
-import com.fs.wx.utils.JsonUtils;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
-
-
-@RestController
-@RequestMapping("/wx/cp/portal/{agentId}")
-public class WxPortalController {
-  private final Logger logger = LoggerFactory.getLogger(this.getClass());
-
-  @GetMapping(produces = "text/plain;charset=utf-8")
-  public String authGet(@PathVariable Integer agentId,
-                        @RequestParam(name = "msg_signature", required = false) String signature,
-                        @RequestParam(name = "timestamp", required = false) String timestamp,
-                        @RequestParam(name = "nonce", required = false) String nonce,
-                        @RequestParam(name = "echostr", required = false) String echostr) {
-    this.logger.info("\n接收到来自微信服务器的认证消息:signature = [{}], timestamp = [{}], nonce = [{}], echostr = [{}]",
-        signature, timestamp, nonce, echostr);
-
-    if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) {
-      throw new IllegalArgumentException("请求参数非法,请核实!");
-    }
-
-    final WxCpService wxCpService = WxCpConfiguration.getCpService(agentId);
-    if (wxCpService == null) {
-      throw new IllegalArgumentException(String.format("未找到对应agentId=[%d]的配置,请核实!", agentId));
-    }
-
-    if (wxCpService.checkSignature(signature, timestamp, nonce, echostr)) {
-      return new WxCpCryptUtil(wxCpService.getWxCpConfigStorage()).decrypt(echostr);
-    }
-
-    return "非法请求";
-  }
-
-  @PostMapping(produces = "application/xml; charset=UTF-8")
-  public String post(@PathVariable Integer agentId,
-                     @RequestBody String requestBody,
-                     @RequestParam("msg_signature") String signature,
-                     @RequestParam("timestamp") String timestamp,
-                     @RequestParam("nonce") String nonce) {
-    this.logger.info("\n接收微信请求:[signature=[{}], timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
-        signature, timestamp, nonce, requestBody);
-
-    final WxCpService wxCpService = WxCpConfiguration.getCpService(agentId);
-    WxCpXmlMessage inMessage = WxCpXmlMessage.fromEncryptedXml(requestBody, wxCpService.getWxCpConfigStorage(),
-        timestamp, nonce, signature);
-    this.logger.debug("\n消息解密后内容为:\n{} ", JsonUtils.toJson(inMessage));
-    WxCpXmlOutMessage outMessage = this.route(agentId, inMessage);
-    if (outMessage == null) {
-      return "";
-    }
-
-    String out = outMessage.toEncryptedXml(wxCpService.getWxCpConfigStorage());
-    this.logger.debug("\n组装回复信息:{}", out);
-    return out;
-  }
-
-  private WxCpXmlOutMessage route(Integer agentId, WxCpXmlMessage message) {
-    try {
-      return WxCpConfiguration.getRouters().get(agentId).route(message);
-    } catch (Exception e) {
-      this.logger.error(e.getMessage(), e);
-    }
-    return null;
-  }
-
-
-}

+ 0 - 8
fs-company-app/src/main/java/com/fs/wx/cp/model/entity/QywxExtContactUser.java

@@ -1,8 +0,0 @@
-package com.fs.wx.cp.model.entity;
-
-import lombok.Data;
-
-@Data
-public class QywxExtContactUser {
-
-}

+ 0 - 8
fs-company-app/src/main/java/com/fs/wx/cp/model/entity/QywxExtContactUserRemark.java

@@ -1,8 +0,0 @@
-package com.fs.wx.cp.model.entity;
-
-import lombok.Data;
-
-@Data
-public class QywxExtContactUserRemark {
-
-}

+ 0 - 102
fs-company-app/src/main/java/com/fs/wx/cp/model/entity/QywxThirdCompany.java

@@ -1,102 +0,0 @@
-package com.fs.wx.cp.model.entity;
-
-public class QywxThirdCompany {
-
-
-    private Integer id;
-    private String corpId;
-    private String permanentCode;
-    private String corpName;
-    private String corpFullName;
-    private Integer subjectType;
-    private String verifiedEndTime;
-    private Integer agentId;
-    private Integer status;
-
-
-    public String getCorpName() {
-        return corpName;
-    }
-
-    public void setCorpName(String corpName) {
-        this.corpName = corpName;
-    }
-
-    public String getCorpFullName() {
-        return corpFullName;
-    }
-
-    public void setCorpFullName(String corpFullName) {
-        this.corpFullName = corpFullName;
-    }
-
-    public Integer getSubjectType() {
-        return subjectType;
-    }
-
-    public void setSubjectType(Integer subjectType) {
-        this.subjectType = subjectType;
-    }
-
-    public String getVerifiedEndTime() {
-        return verifiedEndTime;
-    }
-
-    public void setVerifiedEndTime(String verifiedEndTime) {
-        this.verifiedEndTime = verifiedEndTime;
-    }
-
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    public String getCorpId() {
-        return corpId;
-    }
-
-    public void setCorpId(String corpId) {
-        this.corpId = corpId;
-    }
-
-    public String getPermanentCode() {
-        return permanentCode;
-    }
-
-    public void setPermanentCode(String permanentCode) {
-        this.permanentCode = permanentCode;
-    }
-
-    public Integer getStatus() {
-        return status;
-    }
-
-    public void setStatus(Integer status) {
-        this.status = status;
-    }
-
-    public Integer getAgentId() {
-        return agentId;
-    }
-
-    public void setAgentId(Integer agentId) {
-        this.agentId = agentId;
-    }
-
-    @Override
-    public String toString() {
-        return "QywxThirdCompany{" +
-                "id=" + id +
-                ", corpId='" + corpId + '\'' +
-                ", permanentCode='" + permanentCode + '\'' +
-                ", corpName='" + corpName + '\'' +
-                ", corpFullName='" + corpFullName + '\'' +
-                ", subjectType='" + subjectType + '\'' +
-                ", verifiedEndTime='" + verifiedEndTime + '\'' +
-                ", status=" + status +
-                '}';
-    }
-}

+ 0 - 15
fs-company-app/src/main/java/com/fs/wx/cp/model/entity/QywxThirdDepartment.java

@@ -1,15 +0,0 @@
-package com.fs.wx.cp.model.entity;
-
-import lombok.Data;
-
-@Data
-public class QywxThirdDepartment {
-
-    private Integer id;
-    private String corpId;
-    private String departmentId;
-    private String parentId;
-    private Integer order;
-    private Integer status;
-
-}

+ 0 - 102
fs-company-app/src/main/java/com/fs/wx/cp/model/entity/QywxThirdUser.java

@@ -1,102 +0,0 @@
-package com.fs.wx.cp.model.entity;
-
-import java.util.List;
-
-public class QywxThirdUser {
-
-
-    private Integer id;
-    private String corpId;
-    private String userId;
-    private String name;
-    private String avatar;
-    private Integer status;
-    private QywxThirdCompany company;
-    private List<QywxThirdDepartment> departmentList;
-    private Integer userType;
-
-
-    public String getName() {
-        return name;
-    }
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public QywxThirdCompany getCompany() {
-        return company;
-    }
-
-    public void setCompany(QywxThirdCompany company) {
-        this.company = company;
-    }
-
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    public String getCorpId() {
-        return corpId;
-    }
-
-    public void setCorpId(String corpId) {
-        this.corpId = corpId;
-    }
-
-    public String getUserId() {
-        return userId;
-    }
-
-    public void setUserId(String userId) {
-        this.userId = userId;
-    }
-
-    public String getAvatar() {
-        return avatar;
-    }
-
-    public void setAvatar(String avatar) {
-        this.avatar = avatar;
-    }
-
-    public List<QywxThirdDepartment> getDepartmentList() {
-        return departmentList;
-    }
-
-    public void setDepartmentList(List<QywxThirdDepartment> departmentList) {
-        this.departmentList = departmentList;
-    }
-    public Integer getStatus() {
-        return status;
-    }
-
-    public void setStatus(Integer status) {
-        this.status = status;
-    }
-
-    public Integer getUserType() {
-        return userType;
-    }
-
-    public void setUserType(Integer userType) {
-        this.userType = userType;
-    }
-
-    @Override
-    public String toString() {
-        return "QywxThirdUser{" +
-                "id=" + id +
-                ", corpId='" + corpId + '\'' +
-                ", userId='" + userId + '\'' +
-                ", name='" + name + '\'' +
-                ", avatar='" + avatar + '\'' +
-                ", status=" + status +
-                ", company=" + company +
-                ", departmentList=" + departmentList +
-                '}';
-    }
-}

+ 0 - 61
fs-company-app/src/main/java/com/fs/wx/cp/model/entity/WechatCorpLogin.java

@@ -1,61 +0,0 @@
-package com.fs.wx.cp.model.entity;
-
-
-public class WechatCorpLogin {
-
-    //0 开始 1获取到二维码链接等待扫码  7扫码登录成功 9扫码失败
-    private Integer state=0;
-    private String logoUrl;
-    private String cookieSid;
-    private String entryUrlSchema;
-    private String companyId;
-
-    public String getLogoUrl() {
-        return logoUrl;
-    }
-
-    public void setLogoUrl(String logoUrl) {
-        this.logoUrl = logoUrl;
-    }
-
-    public String getCookieSid() {
-        return cookieSid;
-    }
-
-    public void setCookieSid(String cookieSid) {
-        this.cookieSid = cookieSid;
-    }
-
-    public Integer getState() {
-        return state;
-    }
-
-    public void setState(Integer state) {
-        this.state = state;
-    }
-
-    public String getCompanyId() {
-        return companyId;
-    }
-
-    public void setCompanyId(String companyId) {
-        this.companyId = companyId;
-    }
-
-    public String getEntryUrlSchema() {
-        return entryUrlSchema;
-    }
-
-    public void setEntryUrlSchema(String entryUrlSchema) {
-        this.entryUrlSchema = entryUrlSchema;
-    }
-
-    @Override
-    public String toString() {
-        return "WechatCorpLogin{" +
-                "state=" + state +
-                ", logoUrl='" + logoUrl + '\'' +
-                ", cookieSid='" + cookieSid + '\'' +
-                '}';
-    }
-}

+ 0 - 48
fs-company-app/src/main/java/com/fs/wx/cp/model/excel/QywxContact.java

@@ -1,48 +0,0 @@
-package com.fs.wx.cp.model.excel;
-
-
-
-public class QywxContact {
-
-   // @ExcelProperty("企业id")
-    private String corpId;
- //   @ExcelProperty("id类型 1部门 2人员")
-    private Integer idType;
-   // @ExcelProperty("id")
-    private String idKey;
-  ///  @ExcelProperty("id对应名称")
-    private String idValue;
-
-    public String getCorpId() {
-        return corpId;
-    }
-
-    public void setCorpId(String corpId) {
-        this.corpId = corpId;
-    }
-
-    public Integer getIdType() {
-        return idType;
-    }
-
-    public void setIdType(Integer idType) {
-        this.idType = idType;
-    }
-
-    public String getIdKey() {
-        return idKey;
-    }
-
-    public void setIdKey(String idKey) {
-        this.idKey = idKey;
-    }
-
-    public String getIdValue() {
-        return idValue;
-    }
-
-    public void setIdValue(String idValue) {
-        this.idValue = idValue;
-    }
-
-}

+ 0 - 55
fs-company-app/src/main/java/com/fs/wx/cp/model/xml/MessageReply.java

@@ -1,55 +0,0 @@
-package com.fs.wx.cp.model.xml;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-
-
-@XmlRootElement(name = "xml")
-public class MessageReply {
-
-    @XmlElement(name = "Encrypt")
-    public String encrypt;
-    @XmlElement(name = "MsgSignature")
-    public String msgSignature;
-    @XmlElement(name = "TimeStamp")
-    public String timeStamp;
-    @XmlElement(name = "Nonce")
-    public String nonce;
-
-    @XmlTransient
-    public String getEncrypt() {
-        return encrypt;
-    }
-
-    public void setEncrypt(String encrypt) {
-        this.encrypt = encrypt;
-    }
-
-    @XmlTransient
-    public String getMsgSignature() {
-        return msgSignature;
-    }
-
-    public void setMsgSignature(String msgSignature) {
-        this.msgSignature = msgSignature;
-    }
-
-    @XmlTransient
-    public String getTimeStamp() {
-        return timeStamp;
-    }
-
-    public void setTimeStamp(String timeStamp) {
-        this.timeStamp = timeStamp;
-    }
-
-    @XmlTransient
-    public String getNonce() {
-        return nonce;
-    }
-
-    public void setNonce(String nonce) {
-        this.nonce = nonce;
-    }
-}

+ 0 - 89
fs-company-app/src/main/java/com/fs/wx/cp/model/xml/MessageText.java

@@ -1,89 +0,0 @@
-package com.fs.wx.cp.model.xml;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-
-
-@XmlRootElement(name = "xml")
-public class MessageText {
-
-    @XmlElement(name = "ToUserName")
-    public String toUserName;
-    @XmlElement(name = "FromUserName")
-    public String fromUserName;
-    @XmlElement(name = "CreateTime")
-    public String createTime;
-    @XmlElement(name = "MsgType")
-    public String msgType;
-    @XmlElement(name = "Content")
-    public String content;
-    @XmlElement(name = "MsgId")
-    public String msgId;
-    @XmlElement(name = "AgentID")
-    public String agentID;
-
-    @XmlTransient
-    public String getToUserName() {
-        return toUserName;
-    }
-
-    public void setToUserName(String toUserName) {
-        this.toUserName = toUserName;
-    }
-
-    @XmlTransient
-    public String getFromUserName() {
-        return fromUserName;
-    }
-
-    public void setFromUserName(String fromUserName) {
-        this.fromUserName = fromUserName;
-    }
-
-    @XmlTransient
-    public String getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(String createTime) {
-        this.createTime = createTime;
-    }
-
-    @XmlTransient
-    public String getMsgType() {
-        return msgType;
-    }
-
-
-    public void setMsgType(String msgType) {
-        this.msgType = msgType;
-    }
-
-    @XmlTransient
-    public String getContent() {
-        return content;
-    }
-
-    public void setContent(String content) {
-        this.content = content;
-    }
-
-    @XmlTransient
-    public String getMsgId() {
-        return msgId;
-    }
-
-    public void setMsgId(String msgId) {
-        this.msgId = msgId;
-    }
-
-    @XmlTransient
-    public String getAgentID() {
-        return agentID;
-    }
-
-    public void setAgentID(String agentID) {
-        this.agentID = agentID;
-    }
-}

+ 0 - 33
fs-company-app/src/main/java/com/fs/wx/cp/service/AccessTokenUtil.java

@@ -1,33 +0,0 @@
-package com.fs.wx.cp.service;
-
-import com.fs.common.core.redis.RedisCache;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-@Service
-public class AccessTokenUtil {
-    @Autowired
-    RedisCache redisCache;
-
-
-    public String getSuiteAccessToken(){
-        String suiteAccessToken = redisCache.getCacheObject("suite_access_token");
-        return suiteAccessToken;
-    }
-
-    public String getAccessToken(String corpId){
-        String accessToken = redisCache.getCacheObject(corpId+":access_token");
-        return accessToken;
-    }
-
-    public String getSuiteTicket(){
-        String suiteTicket = redisCache.getCacheObject("suite_ticket");
-        return suiteTicket;
-    }
-
-
-
-
-
-
-}

+ 0 - 778
fs-company-app/src/main/java/com/fs/wx/cp/service/QywxThirdService.java

@@ -1,778 +0,0 @@
-package com.fs.wx.cp.service;
-
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.fs.common.core.redis.RedisCache;
-import com.fs.qywx.domain.QywxCompany;
-import com.fs.qywx.domain.QywxUser;
-import com.fs.qywx.service.IQywxCompanyService;
-import com.fs.qywx.service.IQywxUserService;
-import com.fs.wx.cp.config.QywxCacheConfig;
-import com.fs.wx.cp.config.QywxThirdConfig;
-import com.fs.wx.util.AesException;
-import com.fs.wx.cp.model.entity.WechatCorpLogin;
-import com.fs.wx.cp.model.xml.MessageText;
-import com.fs.wx.util.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.io.FileSystemResource;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
-import org.springframework.stereotype.Service;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@SuppressWarnings("all")
-@Service
-public class QywxThirdService {
-    private final static Logger logger = LoggerFactory.getLogger("test");
-    @Autowired
-    private QywxThirdConfig qywxThirdConfig;
-    @Autowired
-    private QywxCacheConfig qywxCacheConfig;
-    @Autowired
-    RedisCache redisCache;
-    @Autowired
-    private IQywxCompanyService qyxCompanyService;
-    @Autowired
-    private IQywxUserService qywxUserService;
-    @Autowired
-    private AccessTokenUtil accessTokenUtil;
-    @Autowired
-    private QywxUserUtil qywxUserUtil;
-    //********************************** 回调处理   *************************//
-    /**
-     * 指令回调url验证 get请求
-     */
-    public String getVerify(String sVerifyMsgSig,String sVerifyTimeStamp,
-                         String sVerifyNonce,String sVerifyEchoStr){
-
-        String sToken = qywxThirdConfig.getToken();
-        String sCorpID =  qywxThirdConfig.getCorpId();
-        String sEncodingAESKey = qywxThirdConfig.getEncodingAESKey();
-
-        WXBizMsgCrypt wxcpt = null;
-        try {
-            wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);
-        }catch (AesException E){
-            return "error";
-        }
-        String sEchoStr; //需要返回的明文
-        try {
-            sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp,
-                    sVerifyNonce, sVerifyEchoStr);
-        } catch (Exception e) {
-            //验证URL失败,错误原因请查看异常
-            e.printStackTrace();
-            return "error";
-        }
-        return  sEchoStr;
-    }
-
-    /**
-     * 指令回调接收 post请求处理
-     */
-    public String instructCallback(String sVerifyMsgSig,String sVerifyTimeStamp,String sVerifyNonce,String sData){
-        String sToken = qywxThirdConfig.getToken();
-        String sSuiteid =qywxThirdConfig.getSuiteId();
-        String sEncodingAESKey = qywxThirdConfig.getEncodingAESKey();
-        String result = "error";
-        WXBizMsgCrypt wxcpt = null;
-        try {
-            wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sSuiteid);
-        }catch (AesException E){
-            return result;
-        }
-        try{
-            String sMsg = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sData);
-            System.out.println("after encrypt sEncrytMsg: " + sMsg);
-            // 加密成功
-            // TODO: 解析出明文xml标签的内容进行处理
-            // For example:
-            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-            DocumentBuilder db = dbf.newDocumentBuilder();
-            StringReader sr = new StringReader(sMsg);
-            InputSource is = new InputSource(sr);
-            Document document = db.parse(is);
-            Element root = document.getDocumentElement();
-            NodeList infoTypeNode = root.getElementsByTagName("InfoType");
-            String infoType = infoTypeNode.item(0).getTextContent();
-            logger.info(infoType);
-            switch (infoType){
-                case "suite_ticket" :
-                    setSuitTicket(root);
-                    break;
-                case "create_auth":
-                    //获取auth_code
-                    NodeList authcodeNode = root.getElementsByTagName("AuthCode");
-                    String authcode = authcodeNode.item(0).getTextContent();
-                    logger.info("auth code:"+authcode);
-                    getPermentCode(authcode);
-                    ;
-                    break;
-                    //改变授权
-                case "change_auth":
-                    //获取auth_code
-                    System.out.println("root:");
-                    System.out.println(root);
-                    ;
-                    break;
-                case "cancel_auth":
-                    //获取corp_id
-                    NodeList authCorpNode = root.getElementsByTagName("AuthCorpId");
-                    String corpId = authCorpNode.item(0).getTextContent();
-                    qyxCompanyService.deleteQywxCompanyByCorpId(corpId);
-                    ;
-                    break;
-                    //改变事件
-                case "change_contact":
-                    //获取auth_code
-                    changeContact(root);
-
-                    ;
-                    break;
-                case "register_corp":
-                    NodeList stateNode = root.getElementsByTagName("state");
-                    String state = stateNode.item(0).getTextContent();
-                    logger.info("state :"+state);
-                    break;
-                case "batch_job_result":
-                    //通讯录id转译异步任务回调  https://open.work.weixin.qq.com/api/doc/90001/90143/91875
-                    break;
-                default:
-                    logger.info(infoType);
-            }
-        }
-        catch(Exception e)
-        {
-            e.printStackTrace();
-            // 加密失败
-            return result;
-        }
-        result = "success";
-        return  result;
-    }
-
-    private void changeContact(Element root) {
-        NodeList ChangeType = root.getElementsByTagName("ChangeType");
-        String ChangeTypeinfo = ChangeType.item(0).getTextContent();
-        switch (ChangeTypeinfo){
-            case "create_user":
-                //获取auth_code
-                System.out.println("新建用户");
-                String CorpId = root.getElementsByTagName("AuthCorpId").item(0).getTextContent();
-                String userID = root.getElementsByTagName("UserID").item(0).getTextContent();
-                String OpenUserID = root.getElementsByTagName("OpenUserID").item(0).getTextContent();
-                String Name = root.getElementsByTagName("Name").item(0).getTextContent();
-                String MainDepartment = root.getElementsByTagName("MainDepartment").item(0).getTextContent();
-
-                String Avatar = root.getElementsByTagName("Avatar").item(0).getTextContent();
-                QywxUser qywxUser = new QywxUser();
-                qywxUser.setCorpId(CorpId);
-                qywxUser.setUserId(userID);
-                qywxUser.setOpenUserid(OpenUserID);
-                qywxUser.setName(Name);
-                qywxUser.setMainDepartment(Integer.parseInt(MainDepartment));
-
-                qywxUser.setAvatar(Avatar);
-                qywxUser.setStatus(0);
-                qywxUserService.insertQywxUser(qywxUser);
-                break;
-            case "delete_user":
-                System.out.println("删除用户");
-                NodeList AuthCorpIdN = root.getElementsByTagName("AuthCorpId");
-                String AuthCorpId = AuthCorpIdN.item(0).getTextContent();
-                NodeList UserIDNo = root.getElementsByTagName("UserID");
-                String UserID = UserIDNo.item(0).getTextContent();
-                qywxUserService.deleteQywxUserByCorpIdAndCorpId(AuthCorpId,UserID);
-                break;
-            case "update_user":
-                System.out.println("修改用户");
-                NodeList AuCorpId = root.getElementsByTagName("AuthCorpId");
-                String cId = AuCorpId.item(0).getTextContent();
-                NodeList uID = root.getElementsByTagName("UserID");
-                String uid = uID.item(0).getTextContent();
-                NodeList Status = root.getElementsByTagName("Status");
-                if (Status.getLength()!=0){
-                    String status = Status.item(0).getTextContent();
-                    QywxUser q = new QywxUser();
-                    q.setStatus(1);
-                    q.setCorpId(cId);
-                    q.setUserId(uid);
-
-                    qywxUserService.updateQywxUserByUserIdAndCorpId(q);
-                }
-
-                break;
-            case "create_party":
-                System.out.println("创建部门");
-                break;
-            case "delete_party":
-                System.out.println("删除部门");
-                break;
-        }
-    }
-
-    public String dataCallback(String sVerifyMsgSig,String sVerifyTimeStamp,String sVerifyNonce,String sData){
-        String sToken = qywxThirdConfig.getToken();
-        String sEncodingAESKey = qywxThirdConfig.getEncodingAESKey();
-        String result = "error";
-        WXBizMsgCrypt wxcpt = null;
-        try {
-            Object[] encrypt = XMLParse.extract(sData);
-            String sSuiteid = (String) encrypt[2];
-
-            wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sSuiteid);
-        }catch (AesException E){
-            return result;
-        }
-        try{
-            String sMsg = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sData);
-            System.out.println("after encrypt sEncrytMsg: " + sMsg);
-            // 加密成功
-            // TODO: 解析出明文xml标签的内容进行处理
-            // For example:
-            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-            DocumentBuilder db = dbf.newDocumentBuilder();
-            StringReader sr = new StringReader(sMsg);
-            InputSource is = new InputSource(sr);
-            Document document = db.parse(is);
-
-            Element root = document.getDocumentElement();
-            NodeList msgTypeNode = root.getElementsByTagName("MsgType");
-            String msgType = msgTypeNode.item(0).getTextContent();
-            System.out.println("msgType: " + msgType);
-            if(msgType.equals("event")){
-                NodeList eventNode = root.getElementsByTagName("Event");
-                String event = eventNode.item(0).getTextContent();
-                logger.info(event);
-                switch (event){
-                    case "subscribe" :
-                        System.out.println("event: " + event);
-                        break;
-                    case "unsubscribe":
-                        System.out.println("event: " + event);
-                        break;
-                    case "open_approval_change":
-                        break;
-                    case "click":
-                        break;
-                    case "view":
-                        String createTime = String.valueOf(System.currentTimeMillis());
-                        String nonce = "sdfsdfsd";
-                        //文本消息
-                        MessageText msgText = new MessageText();
-                        msgText.setToUserName("");
-                        msgText.setFromUserName("");
-                        msgText.setCreateTime(createTime);
-                        msgText.setMsgType("text");
-                        msgText.setContent("test");
-                        msgText.setMsgId("111111111111111111");
-                        msgText.setAgentID("");
-                        String msgTextXmlStr = XmlConvertUtils.convertToXml(msgText,"utf-8");
-                        //加密消息xml
-                        result  = wxcpt.EncryptMsg(msgTextXmlStr,createTime,nonce);
-                        break;
-                    default:
-                        logger.info(event);
-                }
-            }else{
-               switch (msgType){
-                   case "text" :
-                       break;
-                   case "image" :
-                       break;
-                   case "voice" :
-                       break;
-                   case "location" :
-                       break;
-                   case "video" :
-                       break;
-                   case "link" :
-                       break;
-               }
-            }
-        }
-        catch(Exception e)
-        {
-            e.printStackTrace();
-            // 加密失败
-            System.out.println(result);
-            return result;
-        }
-        result = "success";
-        return  result;
-    }
-    public  String registerCallback(String sVerifyMsgSig,String sVerifyTimeStamp,String sVerifyNonce,String sData){
-        String sToken = qywxThirdConfig.getToken();
-        String sSuiteid =qywxThirdConfig.getSuiteId();
-        String sEncodingAESKey = qywxThirdConfig.getEncodingAESKey();
-        String result = "error";
-        WXBizMsgCrypt wxcpt = null;
-        try {
-            wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sSuiteid);
-        }catch (AesException E){
-            return result;
-        }
-        try{
-            String sMsg = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sData);
-            System.out.println("after encrypt sEncrytMsg: " + sMsg);
-            // 加密成功
-            // TODO: 解析出明文xml标签的内容进行处理
-            // For example:
-            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-            DocumentBuilder db = dbf.newDocumentBuilder();
-            StringReader sr = new StringReader(sMsg);
-            InputSource is = new InputSource(sr);
-            Document document = db.parse(is);
-            Element root = document.getDocumentElement();
-            NodeList infoTypeNode = root.getElementsByTagName("InfoType");
-            String infoType = infoTypeNode.item(0).getTextContent();
-            logger.info(infoType);
-            switch (infoType){
-                case "create_auth":
-                    //获取auth_code
-                    NodeList authcodeNode = root.getElementsByTagName("AuthCode");
-                    String authcode = authcodeNode.item(0).getTextContent();
-                    logger.info("auth code:"+authcode);
-                    ;
-                    break;
-                case "register_corp":
-                    NodeList stateNode = root.getElementsByTagName("state");
-                    String state = stateNode.item(0).getTextContent();
-                    logger.info("state :"+state);
-                    break;
-                default:
-                    logger.info(infoType);
-            }
-        }
-        catch(Exception e)
-        {
-            e.printStackTrace();
-            // 加密失败
-            return result;
-        }
-        result = "success";
-        return  result;
-
-    }
-    //suite_ticket缓存10分钟一次
-    private String setSuitTicket(Element root){
-        NodeList nodelist = root.getElementsByTagName("SuiteTicket");
-        String result = nodelist.item(0).getTextContent();
-        redisCache.setCacheObject("suite_ticket",result);
-        String suiteToken = getSuiteToken(result);
-        redisCache.setCacheObject("suite_access_token",suiteToken);
-        saveAllAccessToken();
-        return result;
-    }
-
-    //获取服务商授权码
-    public String  getSuiteToken(String suiteTicket){
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(MediaType.APPLICATION_JSON);
-        //方式二 对象转字符串j
-
-        JSONObject postJson = new JSONObject();
-        postJson.put("suite_id",qywxThirdConfig.getSuiteId());
-        postJson.put("suite_secret",qywxThirdConfig.getSuiteSecret());
-        postJson.put("suite_ticket",suiteTicket);
-        Map response = RestUtils.post(qywxThirdConfig.getSuiteTokenUrl(),postJson);
-        //获取错误日志
-        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-            logger.error(response.toString());
-        }
-        String result = (String) response.get("suite_access_token");
-        return result;
-    }
-
-    //********************************** 应用安装   *************************//
-
-    public Boolean getPermentCode(String authCode){
-        //通过auth code获取公司信息及永久授权码
-        JSONObject postJson = new JSONObject();
-        postJson.put("auth_code",authCode);
-        logger.error(postJson.toString());
-        String suiteAccessToken = redisCache.getCacheObject("suite_access_token");
-        String url = String.format(qywxThirdConfig.getPermanentCodeUrl(),suiteAccessToken);
-        Map response = RestUtils.post(url,postJson);
-        //获取错误日志
-        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-            logger.error(response.toString());
-            return  false;
-        }
-        logger.error(response.toString());
-        //保存授权公司信息
-        String permanenCode= (String) response.get("permanent_code");
-        //获取corpId
-        Map authCorpInfo =(Map) response.get("auth_corp_info");
-        String corpId = (String) authCorpInfo.get("corpid");
-        redisCache.setCacheObject(corpId,permanenCode);
-        //获取agent
-        Map authInfo = (Map) response.get("auth_info");
-        List agentList = (List) authInfo.get("agent");
-        Map agent = (Map) agentList.get(0);
-        Integer agentId = (Integer) agent.get("agentid");
-        QywxCompany company = new QywxCompany();
-        company.setPermanentCode(permanenCode);
-        company.setCorpId(corpId) ;
-        company.setCorpName((String) authCorpInfo.get("corp_name"));
-        String fullName = authCorpInfo.get("corp_full_name") ==  null  ? "" :  (String)authCorpInfo.get("corp_full_name");
-        company.setCorpFullName(fullName);
-        company.setSubjectType((Integer) authCorpInfo.get("subject_type"));
-        //设置授权应用id  用于Jssdk agentconfig等使用
-        company.setAgentId(agentId);
-        company.setStatus(1);
-        logger.info(company.toString());
-        qyxCompanyService.insertQywxCompany(company);
-        //授权用户信息
-        QywxUser user = new QywxUser();
-        Map authUserInfo = (Map) response.get("auth_user_info");
-        user.setUserId((String)authUserInfo.get("userid"));
-        user.setName((String)authUserInfo.get("name"));
-        user.setAvatar((String)authUserInfo.get("avatar"));
-        user.setCorpId(corpId);
-        user.setStatus(1);
-        user.setOpenUserid((String)authUserInfo.get("open_userid"));
-        logger.info(user.toString());
-        String s = permanentCodegetAccessToken(permanenCode, corpId);
-        //异步同步部门,人员 待处理
-        Map<String,QywxUser> userList = qywxUserUtil.getUserList(s, corpId);
-        userList.put(user.getUserId(),user);
-        for(String key:userList.keySet()) {
-            QywxUser u = userList.get(key);
-            qywxUserService.insertQywxUser(u);
-        }
-
-            return true;
-
-    }
-
-
-
-
-
-
-
-
-
-
-
-    //获取所有企业授权码
-    public void saveAllAccessToken(){
-        QywxCompany qywxCompany = new QywxCompany();
-        qywxCompany.setStatus(1);
-        List<QywxCompany> q = qyxCompanyService.selectQywxCompanyList(qywxCompany);
-        for (QywxCompany company : q) {
-            permanentCodegetAccessToken(company.getPermanentCode(),company.getCorpId());
-        }
-    }
-    //获取企业授权码
-    public String permanentCodegetAccessToken(String permanenCode,String corpId){
-        JSONObject postJson = new JSONObject();
-        postJson.put("auth_corpid",corpId);
-        postJson.put("permanent_code",permanenCode);
-        logger.error(postJson.toString());
-        String suiteAccessToken = redisCache.getCacheObject("suite_access_token");
-        String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/service/get_corp_token?suite_access_token=%s",suiteAccessToken);
-        Map response = RestUtils.post(url,postJson);
-        //获取错误日志
-        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-            logger.error(response.toString());
-            return null;
-        }
-        logger.error(response.toString());
-        String acc= (String) response.get("access_token");
-        redisCache.setCacheObject(corpId+":access_token",acc);
-        return acc;
-    }
-
-
-
-
-
-
-//    //获取临时授权码
-//    public String getPreAuthCode(){
-//        String result = "";
-//        String token = getSuiteToken();
-//        String url = String.format(qywxThirdConfig.getPreAuthCodeUrl(),token);
-//        Map response = RestUtils.get(url);
-//        //获取错误日志
-//        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-//            logger.error(response.toString());
-//        }else{
-//            result = (String) response.get("pre_auth_code");
-//            //设置授权楝,对某次预授权码pre_auth_code进行授权类型设置
-//            setSessionInfo(result);
-//        }
-//        System.out.println("pre_auth_code: "+result);
-//        return result;
-//    }
-//    private Boolean setSessionInfo(String preAuthCode){
-//        String token = getSuiteToken();
-//        //如是测试授权,设置授权配置
-//        //if(qywxThirdConfig.getAuthType() == 1){
-//            JSONObject sessionInfo = new JSONObject();
-//            sessionInfo.put("appid", new int[0]);
-//            sessionInfo.put("auth_type",qywxThirdConfig.getAuthType());
-//            JSONObject postJson = new JSONObject();
-//            postJson.put("pre_auth_code",preAuthCode);
-//            postJson.put("session_info",sessionInfo);
-//            logger.error(postJson.toString());
-//            String sessionInfoUrl = String.format(qywxThirdConfig.getSessionInfoUrl(),token);
-//            Map sessionResponse = RestUtils.post(sessionInfoUrl,postJson);
-//            //获取错误日志
-//            if(sessionResponse.containsKey("errcode") && (Integer) sessionResponse.get("errcode") != 0){
-//                logger.error(sessionResponse.toString());
-//                return false;
-//            }
-//        //}
-//        return  true;
-//    }
-
-//    public String getInstallUrl(String url){
-//        String preAuthCode= getPreAuthCode();
-//        String result = String.format(qywxThirdConfig.getInstallUrl(),qywxThirdConfig.getSuiteId(),preAuthCode,url);
-//        return  result;
-//    }
-
-
-
-    //**********************************  服务商相关   *************************//
-    public String getProviderToken(){
-        JSONObject postJson = new JSONObject();
-        postJson.put("corpid",qywxThirdConfig.getCorpId());
-        postJson.put("provider_secret",qywxThirdConfig.getProviderSecret());
-        String url = qywxThirdConfig.getProviderTokenUlr();
-        logger.info(url);
-        logger.info(postJson.toJSONString());
-        JSONObject response = RestUtils.post(url,postJson);
-        //获取错误日志
-        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-            logger.error(response.toString());
-        }
-        String token =  (String) response.get("provider_access_token");
-        return  token;
-
-    }
-
-    public String getRegisterCode(){
-        String url = String.format(qywxThirdConfig.getRegisterCodeUrl(),getProviderToken()) ;
-        JSONObject postJson = new JSONObject();
-        postJson.put("template_id",qywxThirdConfig.getTemplateId());
-        postJson.put("state","lyx123456");
-        JSONObject response = RestUtils.post(url,postJson);
-        //获取错误日志
-        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-            logger.error(response.toString());
-        }
-        String token =  (String) response.get("register_code");
-        return  token;
-    }
-
-    public String getRegisterUrl(){
-        String registerUrl = String.format(qywxThirdConfig.getRegisterUrl(),getRegisterCode());
-        return  registerUrl;
-    }
-
-    //**********************************  通讯录相关   *************************//
-    /**
-     *
-     * @param filePath
-     * @return
-     * {
-     *    "errcode": 0,
-     *    "errmsg": "",
-     *    "type": "image",
-     *    "media_id": "1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0",
-     *    "created_at": "1380000000"
-     * }
-     *
-     */
-    public Map uploadContact(String filePath){
-        //https://open.work.weixin.qq.com/api/doc/90001/90143/91883
-        String providerToken = getProviderToken();
-        String url = String.format(qywxThirdConfig.getContactUploadUrl(),providerToken,"file");
-        MultiValueMap<String, Object> params= new LinkedMultiValueMap<>();
-        FileSystemResource resource = new FileSystemResource(new File(filePath));
-        params.add("media",resource);
-        return  RestUtils.upload(url,params);
-    }
-
-    /**
-     *
-     * @return
-     * {
-     *     "errcode": 0,
-     *     "errmsg": "ok",
-     *     "jobid": "xxxxx"
-     * }
-     */
-    public Map transContact(String corpId,String mediaId){
-        //https://open.work.weixin.qq.com/api/doc/90001/90143/91846
-        /**
-         * 参数
-         * {
-         *     "auth_corpid": "wwxxxx",
-         *     "media_id_list": ["1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0"],
-         *     "output_file_name": "学习手册",
-         *     "output_file_format": "pdf"
-         * }
-         */
-        String providerToken = getProviderToken();
-        String url = String.format(qywxThirdConfig.getContactTransUrl(),providerToken);
-        JSONObject postJson = new JSONObject();
-        postJson.put("auth_corpid",corpId);
-        JSONArray mediaList = new JSONArray();
-        mediaList.add(mediaId);
-        postJson.put("media_id_list",mediaList);
-        return  RestUtils.post(url,postJson);
-    }
-
-    /**
-     *
-     * @param jobId
-     * @return
-     * {
-     *     "errcode": 0,
-     *     "errmsg": "ok",
-     *     "status": 1,
-     *     "type": "contact_id_translate",
-     *     "result": {
-     *         "contact_id_translate":{
-     *             "url":"xxxx"
-     *         }
-     *     }
-     * }
-     */
-    public Map getTransResult(String jobId){
-        //https://open.work.weixin.qq.com/api/doc/90001/90143/91882
-        /**
-         * id
-         */
-        String corpToken = getProviderToken();
-        String url = String.format(qywxThirdConfig.getTransResultUrl(),corpToken,jobId);
-        Map rs = RestUtils.get(url);
-        rs.put("rs_url",url);
-        return rs;
-    }
-    public String downloadTrans(String rerefeUrl, String downloadUrl, String targetPath, WechatCorpLogin login) throws IOException {
-        //通过cookie及refer模拟下载转译结果
-        //设置请求头cookie及refer
-        //指定header
-        HttpHeaders headers = new HttpHeaders();
-        headers.set("Referer", rerefeUrl);
-        headers.set("Cookie", login.getCookieSid());
-        HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>( headers);
-        String filePath = RestUtils.download(downloadUrl,targetPath,httpEntity);
-        return filePath;
-    }
-
-
-    //**********************************  PC相关   *************************//
-    //PC网页 sso  用于非企业微信环境下扫码登录,如运行在浏览的器应用后台或者脱离企业微信环境下H5应用
-    //https://open.work.weixin.qq.com/wwopen/sso/3rd_qrConnect?appid=ww100000a5f2191&redirect_uri=http%3A%2F%2Fwww.oa.com&state=web_login@gyoss9&usertype=admin
-    public  String getSsoUrl(String redirectUrl,String userType){
-        String state = "test";
-        String ssoUrl = String.format(qywxThirdConfig.getSsoAuthUrl(),qywxThirdConfig.getCorpId(),redirectUrl,state,userType);
-        return ssoUrl;
-    }
-
-    public Map getLoginInfo(String authCode){
-        String url = String.format(qywxThirdConfig.getLoginInfoUrl(),getProviderToken()) ;
-        JSONObject postJson = new JSONObject();
-        postJson.put("auth_code",authCode);
-        JSONObject response = RestUtils.post(url,postJson);
-        //获取错误日志
-        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-            logger.error(response.toString());
-        }
-        return  response;
-
-    }
-
-
-    //********************************** H5应用 Oauth   *************************//
-    public String getOauthUrl(String url){
-//        应用授权作用域。
-//        snsapi_base:静默授权,可获取成员的基础信息(UserId与DeviceId);
-//        snsapi_userinfo:静默授权,可获取成员的详细信息,但不包含手机、邮箱等敏感信息;
-//        snsapi_privateinfo:手动授权,可获取成员的详细信息,包含手机、邮箱等敏感信息(已不再支持获取手机号/邮箱)。
-        String scope = "snsapi_userinfo";
-        String state = "sdfds343";
-        String result = String.format(qywxThirdConfig.getOauthUrl(),qywxThirdConfig.getSuiteId(),url,scope,state);
-        return  result;
-    }
-
-//    public Map getOauthUser(String code) {
-//
-//        String suiteToken = getSuiteToken();
-//        //方法三
-//        String getOauthUrl = String.format(qywxThirdConfig.getOauthUserUrl(),suiteToken,code);
-//        Map  response = RestUtils.get(getOauthUrl);
-//        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-//            logger.error(response.toString());
-//            return  response;
-//        }
-//
-//        String userTicket = (String) response.get("user_ticket");
-//        //获取访问用户敏感信息
-//        JSONObject postJson = new JSONObject();
-//        postJson.put("user_ticket",userTicket);
-//        String url = String.format(qywxThirdConfig.getOauthUserDetailUrl(),suiteToken);
-//        Map detaiResponse = RestUtils.post(url,postJson);
-//        //获取错误日志
-//        if(detaiResponse.containsKey("errcode") && (Integer) detaiResponse.get("errcode") != 0){
-//            logger.error(detaiResponse.toString());
-//        }
-//        /**
-//         * {
-//         * 	"errcode": 0,
-//         * 	"errmsg": "ok",
-//         * 	"corpid": "wwcc3b4b831051d56e",
-//         * 	"userid": "LiYueXi",
-//         * 	"name": "LiYueXi",
-//         * 	"department": [1],
-//         * 	"gender": "1",
-//         * 	"avatar": "https://rescdn.qqmail.com/node/wwmng/wwmng/style/images/independent/DefaultAvatar$73ba92b5.png",
-//         * 	"open_userid": "woMAh2BwAApVMP0ZDYUk42tUw3CIeHFA"
-//         * }
-//         */
-//
-//        return detaiResponse;
-//
-//    }
-
-    //******************************  小程序应用   *********************//
-//    public Map getCode2sessionUser(String code){
-//        String suiteToken = getSuiteToken();
-//        //获取访问用户身份
-////        Map paramsMap = new HashMap();
-////        paramsMap.put("suite_access_token",suiteToken);
-////        paramsMap.put("code",code);
-//        String url = String.format(qywxThirdConfig.getCode2sessionUrl(),suiteToken,code);
-//        Map response = RestUtils.get(url);
-//        //获取错误日志
-//        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-//            logger.error(response.toString());
-//        }
-//        return  response;
-//    }
-
-
-}

+ 0 - 188
fs-company-app/src/main/java/com/fs/wx/cp/service/QywxUserUtil.java

@@ -1,188 +0,0 @@
-package com.fs.wx.cp.service;
-
-import com.alibaba.fastjson.JSONObject;
-import com.fs.common.core.redis.RedisCache;
-import com.fs.common.utils.spring.SpringUtils;
-import com.fs.qywx.domain.QywxCustomUser;
-import com.fs.qywx.domain.QywxUser;
-import com.fs.wx.cp.config.QywxCacheConfig;
-import com.fs.wx.cp.config.QywxThirdConfig;
-import com.fs.wx.util.RestUtils;
-import io.swagger.models.auth.In;
-import org.apache.commons.collections4.Get;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
-import org.springframework.stereotype.Service;
-
-import java.util.*;
-
-@SuppressWarnings("all")
-@Service
-public class QywxUserUtil {
-    private final static Logger logger = LoggerFactory.getLogger("test");
-
-    QywxThirdConfig qywxThirdConfig=new QywxThirdConfig();
-    QywxCacheConfig qywxCacheConfig= new QywxCacheConfig();
-//    @Autowired
-//    private QywxThirdConfig qywxThirdConfig;
-//    @Autowired
-//    private QywxCacheConfig qywxCacheConfig;
-    @Autowired
-    RedisCache redisCache;
-
-    //获取客户列表
-    public List getExtContactList(String userId,String accessToken){
-        String url = String.format(qywxThirdConfig.getExtContactListUrl(),accessToken,userId);
-        Map response = RestUtils.get(url);
-        //获取错误日志
-        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-            logger.error(response.toString());
-            return null;
-        }
-        List ids = (List) response.get("external_userid");
-        return ids;
-    }
-
-    //获取单个客户详情
-    public Map getExtContactInfo(String userId,String accessToken){
-        String url = String.format(qywxThirdConfig.getExtContactInfoUrl(),accessToken,userId,"500");
-        Map response = RestUtils.get(url);
-        //获取错误日志
-        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-            logger.error(response.toString());
-            return null;
-        }
-        return response;
-    }
-    //获取客户列表带详情
-    public List<QywxCustomUser> getExtContactInfoList(List userIdList,String accessToken){
-        String url = String.format(qywxThirdConfig.getExtContactInfoListUrl(),accessToken);
-        JSONObject postJson = new JSONObject();
-        postJson.put("userid_list",userIdList);
-        postJson.put("limit",100);
-        Map response = RestUtils.post(url,postJson);
-        //获取错误日志
-        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-            logger.error(response.toString());
-            return null;
-        }
-        List<Map> externalContactList = (List) response.get("external_contact_list");
-        ArrayList<QywxCustomUser> qwUser = new ArrayList<>();
-        for (Map user : externalContactList) {
-            System.out.println(user);
-            Map m = (Map)user.get("follow_info");
-            QywxCustomUser u = new QywxCustomUser();
-            System.out.println((String) m.get("userid"));
-            u.setUserid((String) m.get("userid"));
-
-            System.out.println(u);
-            u.setRemark((String) m.get("remark"));
-            u.setDescription((String)m.get("description"));
-            List<String> tag = (List<String>) m.get("tag_id");
-            u.setTagId(tag.toString());
-            List<String> mobiles = (List<String>) m.get("remark_mobiles");
-            u.setRemarkMobiles(mobiles.toString());
-            u.setRemarkCorpName((String)m.get("remark_corp_name"));
-            u.setAddWay((Integer) m.get("add_way"));
-            u.setOperUserid((String)m.get("oper_userid"));
-            Map external = (Map)user.get("external_contact");
-            System.out.println(external);
-            u.setExternalUserid((String)external.get("external_userid"));
-            u.setName((String)external.get("name"));
-            u.setType((Integer)external.get("type"));
-            qwUser.add(u);
-        }
-        return qwUser;
-    }
-    //修改备注信息
-    public Boolean updateExtContactInfo(String accessToken){
-        String url = String.format(qywxThirdConfig.getUpdateExtContactInfoListUrl(),accessToken);
-        JSONObject postJson = new JSONObject();
-        postJson.put("userid","ZhuangXu");
-        postJson.put("external_userid","wm-YxDcgAA9PUhpOViiMgiqQ-ZgsJP_A");
-        postJson.put("remark","HE");
-        postJson.put("description","描述信息de 描述信息");
-        postJson.put("remark_company","备注的企业XX企业");
-        postJson.put("remark_mobiles", Arrays.asList("17302557022"));
-        Map response = RestUtils.post(url,postJson);
-        //获取错误日志
-        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-            logger.error(response.toString());
-            return false;
-        }
-        return true;
-    }
-    //获取企业标签
-    public List getCorpTagListUrl(String accessToken){
-        String url = String.format(qywxThirdConfig.getCorpTagListUrl(),accessToken);
-        JSONObject postJson = new JSONObject();
-        postJson.put("limit",100);
-        Map response = RestUtils.post(url,null);
-        //获取错误日志
-        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-            logger.error(response.toString());
-            return null;
-        }
-        List corpTagList = (List) response.get("tag_group");
-        return corpTagList;
-    }
-
-
-    //获取可见部门所有用户
-    public Map<String,QywxUser> getUserList(String accessToken,String corpId){
-        String url = String.format(qywxThirdConfig.getDepartmentID(),accessToken);
-        Map response = RestUtils.get(url);
-        //获取错误日志
-        if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-            logger.error(response.toString());
-            return null;
-        }
-        List<Map> corpTagList = (List) response.get("department_id");
-        HashMap<String, QywxUser> Map = new HashMap<>();
-        for (Map m : corpTagList) {
-            Integer id = (Integer) m.get("id");
-            String urlU = String.format(qywxThirdConfig.getDepartmentUser(),accessToken,id);
-            Map re = RestUtils.get(urlU);
-            if(re.containsKey("errcode") && (Integer) response.get("errcode") != 0){
-                logger.error(re.toString());
-            }
-            List<Map> userlist = (List)re.get("userlist");
-            if (userlist!=null){
-                for (Map mp : userlist) {
-                    QywxUser qywxUser = new QywxUser();
-                    qywxUser.setUserId((String)mp.get("userid"));
-                    qywxUser.setName((String)mp.get("name"));
-                    qywxUser.setAvatar((String)mp.get("avatar"));
-                    qywxUser.setOpenUserid((String)mp.get("open_userid"));
-                    qywxUser.setMainDepartment((Integer) mp.get("main_department"));
-                    qywxUser.setCorpId(corpId);
-                    qywxUser.setStatus(1);
-                    Map.put((String)mp.get("name"),qywxUser);
-                }
-            }
-
-
-        }
-        return Map;
-    }
-//获取配置了外部联系人的用户
-    public List<String> getFollowUserList(String accessToken) {
-        String url = String.format(qywxThirdConfig.getExtContactFollowUserListUrl(), accessToken);
-        Map response = RestUtils.get(url);
-        //获取错误日志
-        if (response.containsKey("errcode") && (Integer) response.get("errcode") != 0) {
-            logger.error(response.toString());
-            return null;
-        }
-        return (List<String>) response.get("follow_user");
-    }
-
-
-
-
-}
-
-//为客户修改企业标签

+ 0 - 58
fs-company-app/src/main/java/com/fs/wx/util/AesException.java

@@ -1,58 +0,0 @@
-package com.fs.wx.util;
-
-public class AesException extends Exception {
-
-    public final static int OK = 0;
-    public final static int ValidateSignatureError = -40001;
-    public final static int ParseXmlError = -40002;
-    public final static int ComputeSignatureError = -40003;
-    public final static int IllegalAesKey = -40004;
-    public final static int ValidateCorpidError = -40005;
-    public final static int EncryptAESError = -40006;
-    public final static int DecryptAESError = -40007;
-    public final static int IllegalBuffer = -40008;
-    //public final static int EncodeBase64Error = -40009;
-    //public final static int DecodeBase64Error = -40010;
-    //public final static int GenReturnXmlError = -40011;
-
-    private int code;
-
-    private static String getMessage(int code) {
-        switch (code) {
-            case ValidateSignatureError:
-                return "签名验证错误";
-            case ParseXmlError:
-                return "xml解析失败";
-            case ComputeSignatureError:
-                return "sha加密生成签名失败";
-            case IllegalAesKey:
-                return "SymmetricKey非法";
-            case ValidateCorpidError:
-                return "corpid校验失败";
-            case EncryptAESError:
-                return "aes加密失败";
-            case DecryptAESError:
-                return "aes解密失败";
-            case IllegalBuffer:
-                return "解密后得到的buffer非法";
-//		case EncodeBase64Error:
-//			return "base64加密错误";
-//		case DecodeBase64Error:
-//			return "base64解密错误";
-//		case GenReturnXmlError:
-//			return "xml生成失败";
-            default:
-                return null; // cannot be
-        }
-    }
-
-    public int getCode() {
-        return code;
-    }
-
-    AesException(int code) {
-        super(getMessage(code));
-        this.code = code;
-    }
-
-}

+ 0 - 26
fs-company-app/src/main/java/com/fs/wx/util/ByteGroup.java

@@ -1,26 +0,0 @@
-package com.fs.wx.util;
-
-import java.util.ArrayList;
-
-class ByteGroup {
-	ArrayList<Byte> byteContainer = new ArrayList<Byte>();
-
-	public byte[] toBytes() {
-		byte[] bytes = new byte[byteContainer.size()];
-		for (int i = 0; i < byteContainer.size(); i++) {
-			bytes[i] = byteContainer.get(i);
-		}
-		return bytes;
-	}
-
-	public ByteGroup addBytes(byte[] bytes) {
-		for (byte b : bytes) {
-			byteContainer.add(b);
-		}
-		return this;
-	}
-
-	public int size() {
-		return byteContainer.size();
-	}
-}

+ 0 - 119
fs-company-app/src/main/java/com/fs/wx/util/HttpUt.java

@@ -1,119 +0,0 @@
-package com.fs.wx.util;
-
-import com.alibaba.fastjson.JSONObject;
-
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.HttpURLConnection;
-import java.net.URL;
-
-public class HttpUt {
-
-    /**
-     * http get请求
-     *
-     * @param url
-     * @return
-     */
-    public static JSONObject sendGet(String url) {
-        JSONObject jsonObject = null;
-        jsonObject = httpRequest(url, "GET", null);
-        return jsonObject;
-    }
-
-
-    /**
-     * http post请求
-     *
-     * @param url
-     * @return
-     */
-    public static JSONObject sendPost(String url) {
-        JSONObject jsonObject = null;
-        jsonObject = httpRequest(url, "POST", null);
-        return jsonObject;
-    }
-
-    /**
-     * http post请求
-     *
-     * @param url
-     * @param output json串
-     * @return
-     */
-    public static JSONObject sendPost(String url, String output) {
-        JSONObject jsonObject = null;
-        jsonObject = httpRequest(url, "POST", output);
-        return jsonObject;
-    }
-
-
-    /**
-     * 发起https请求并获取结果
-     *
-     * @param request       请求地址
-     * @param requestMethod 请求方式(GET、POST)
-     * @param output        提交的数据
-     * @return JSONObject(通过JSONObject.get ( key)的方式获取json对象的属性值)
-     */
-    private static JSONObject httpRequest(String request, String requestMethod, String output) {
-        JSONObject jsonObject = null;
-        StringBuffer buffer = new StringBuffer();
-        InputStream inputStream = null;
-        InputStreamReader inputStreamReader = null;
-        BufferedReader reader = null;
-        try {
-            //建立连接
-            URL url = new URL(request);
-            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-            connection.setDoOutput(true);
-            connection.setDoInput(true);
-            connection.setConnectTimeout(3000);
-            connection.setReadTimeout(30000);
-            connection.setUseCaches(false);
-            connection.setRequestMethod(requestMethod);
-            if (output != null) {
-                OutputStream out = connection.getOutputStream();
-                out.write(output.getBytes("UTF-8"));
-                out.close();
-            }
-            //流处理
-            inputStream = connection.getInputStream();
-            inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
-            reader = new BufferedReader(inputStreamReader);
-            String line;
-            while ((line = reader.readLine()) != null) {
-                buffer.append(line);
-            }
-            //关闭连接、释放资源
-            reader.close();
-            inputStreamReader.close();
-            inputStream.close();
-            inputStream = null;
-            connection.disconnect();
-            jsonObject = JSONObject.parseObject(buffer.toString());
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            // 使用finally块来关闭输出流、输入流
-            try {
-                if (reader != null) {
-                    reader.close();
-                }
-                if (inputStreamReader != null) {
-                    inputStreamReader.close();
-                }
-                if (inputStream != null) {
-                    inputStream.close();
-                }
-
-            } catch (Exception ex) {
-                ex.printStackTrace();
-            }
-        }
-        return jsonObject;
-    }
-
-}

+ 0 - 67
fs-company-app/src/main/java/com/fs/wx/util/PKCS7Encoder.java

@@ -1,67 +0,0 @@
-/**
- * 对公众平台发送给公众账号的消息加解密示例代码.
- *
- * @copyright Copyright (c) 1998-2014 Tencent Inc.
- */
-
-// ------------------------------------------------------------------------
-
-package com.fs.wx.util;
-
-import java.nio.charset.Charset;
-import java.util.Arrays;
-
-/**
- * 提供基于PKCS7算法的加解密接口.
- */
-class PKCS7Encoder {
-	static Charset CHARSET = Charset.forName("utf-8");
-	static int BLOCK_SIZE = 32;
-
-	/**
-	 * 获得对明文进行补位填充的字节.
-	 *
-	 * @param count 需要进行填充补位操作的明文字节个数
-	 * @return 补齐用的字节数组
-	 */
-	static byte[] encode(int count) {
-		// 计算需要填充的位数
-		int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
-		if (amountToPad == 0) {
-			amountToPad = BLOCK_SIZE;
-		}
-		// 获得补位所用的字符
-		char padChr = chr(amountToPad);
-		String tmp = new String();
-		for (int index = 0; index < amountToPad; index++) {
-			tmp += padChr;
-		}
-		return tmp.getBytes(CHARSET);
-	}
-
-	/**
-	 * 删除解密后明文的补位字符
-	 *
-	 * @param decrypted 解密后的明文
-	 * @return 删除补位字符后的明文
-	 */
-	static byte[] decode(byte[] decrypted) {
-		int pad = (int) decrypted[decrypted.length - 1];
-		if (pad < 1 || pad > 32) {
-			pad = 0;
-		}
-		return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
-	}
-
-	/**
-	 * 将数字转化成ASCII码对应的字符,用于对明文进行补码
-	 *
-	 * @param a 需要转化的数字
-	 * @return 转化得到的字符
-	 */
-	static char chr(int a) {
-		byte target = (byte) (a & 0xFF);
-		return (char) target;
-	}
-
-}

+ 0 - 114
fs-company-app/src/main/java/com/fs/wx/util/RestUtils.java

@@ -1,114 +0,0 @@
-package com.fs.wx.util;
-
-import com.alibaba.fastjson.JSONObject;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.*;
-import org.springframework.util.MultiValueMap;
-import org.springframework.web.client.RestTemplate;
-import org.springframework.web.util.UriComponentsBuilder;
-
-import java.io.IOException;
-import java.net.URI;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.Map;
-import java.util.Objects;
-
-@Configuration
-public class RestUtils {
-
-    private static final RestTemplate restTemplate = new RestTemplate();
-
-    public static JSONObject get(String url, Map<String,String> urlParams){
-        return get(urlToUri(url,urlParams));
-    }
-
-    //在处理企业微信某些参数时有问题
-    public static JSONObject get(String url){
-        return get(URI.create(url));
-    }
-
-    private static JSONObject get(URI uri){
-        ResponseEntity<JSONObject> responseEntity =restTemplate.getForEntity(uri, JSONObject.class);
-        serverIsRight(responseEntity);   //判断服务器返回状态码
-        return responseEntity.getBody();
-    }
-
-    public static JSONObject post(String url, Map<String,String> urlParams, JSONObject json){
-        //组装url
-        return post(urlToUri(url,urlParams),json);
-    }
-
-    public static JSONObject post(String url, JSONObject json){
-        //组装urL
-        return post(URI.create(url),json);
-    }
-
-    private static JSONObject post(URI uri, JSONObject json){
-        //组装url
-        //设置提交json格式数据
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(MediaType.APPLICATION_JSON);
-        HttpEntity<JSONObject> request = new HttpEntity(json, headers);
-        ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(uri,request, JSONObject.class);
-        serverIsRight(responseEntity);  //判断服务器返回状态码
-        return responseEntity.getBody();
-    }
-
-    private static URI urlToUri(String url,Map<String,String> urlParams){
-        //设置提交json格式数据
-        UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(url);
-        for(Map.Entry<String,String> entry : urlParams.entrySet())  {
-            uriBuilder.queryParam((String)entry.getKey(),  (String) entry.getValue()) ;
-        }
-        return  uriBuilder.build(true).toUri();
-    }
-
-    public static JSONObject upload(String url, MultiValueMap formParams){
-        //设置表单提交
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
-        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(formParams, headers);
-        ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(url,request, JSONObject.class);
-        serverIsRight(responseEntity);  //判断服务器返回状态码
-        return responseEntity.getBody();
-    }
-
-    public static String download(String url, String targetPath, HttpEntity<MultiValueMap<String, String>> httpEntity ) throws IOException {
-
-        ResponseEntity<byte[]> rsp = restTemplate.exchange(url, HttpMethod.GET, httpEntity, byte[].class);
-        if(rsp.getStatusCode() != HttpStatus.OK){
-            System.out.println("文件下载请求结果状态码:" + rsp.getStatusCode());
-        }
-        // 将下载下来的文件内容保存到本地
-        Files.write(Paths.get(targetPath), Objects.requireNonNull(rsp.getBody()));
-        return targetPath;
-    }
-
-    public static String download(String url,String targetPath) throws IOException {
-
-        ResponseEntity<byte[]> rsp = restTemplate.getForEntity(url, byte[].class);
-        if(rsp.getStatusCode() != HttpStatus.OK){
-            System.out.println("文件下载请求结果状态码:" + rsp.getStatusCode());
-        }
-        // 将下载下来的文件内容保存到本地
-        Files.write(Paths.get(targetPath), Objects.requireNonNull(rsp.getBody()));
-        return targetPath;
-
-    }
-
-    public static byte[] dowload(String url){
-        ResponseEntity<byte[]> rsp = restTemplate.getForEntity(url, byte[].class);
-        return rsp.getBody();
-    }
-
-    private static void serverIsRight(ResponseEntity responseEntity){
-        if(responseEntity.getStatusCodeValue()==200){
-//            System.out.println("服务器请求成功:{}"+responseEntity.getStatusCodeValue());
-        }else {
-            System.out.println("服务器请求异常:{}"+responseEntity.getStatusCodeValue());
-        }
-    }
-
-
-}

+ 0 - 62
fs-company-app/src/main/java/com/fs/wx/util/SHA1.java

@@ -1,62 +0,0 @@
-/**
- * 对公众平台发送给公众账号的消息加解密示例代码.
- *
- * @copyright Copyright (c) 1998-2014 Tencent Inc.
- */
-
-// ------------------------------------------------------------------------
-
-package com.fs.wx.util;
-
-
-import java.security.MessageDigest;
-import java.util.Arrays;
-
-/**
- * SHA1 class
- *
- * 计算公众平台的消息签名接口.
- */
-class SHA1 {
-
-	/**
-	 * 用SHA1算法生成安全签名
-	 * @param token 票据
-	 * @param timestamp 时间戳
-	 * @param nonce 随机字符串
-	 * @param encrypt 密文
-	 * @return 安全签名
-	 * @throws AesException
-	 */
-	public static String getSHA1(String token, String timestamp, String nonce, String encrypt) throws AesException
-			  {
-		try {
-			String[] array = new String[] { token, timestamp, nonce, encrypt };
-			StringBuffer sb = new StringBuffer();
-			// 字符串排序
-			Arrays.sort(array);
-			for (int i = 0; i < 4; i++) {
-				sb.append(array[i]);
-			}
-			String str = sb.toString();
-			// SHA1签名生成
-			MessageDigest md = MessageDigest.getInstance("SHA-1");
-			md.update(str.getBytes());
-			byte[] digest = md.digest();
-
-			StringBuffer hexstr = new StringBuffer();
-			String shaHex = "";
-			for (int i = 0; i < digest.length; i++) {
-				shaHex = Integer.toHexString(digest[i] & 0xFF);
-				if (shaHex.length() < 2) {
-					hexstr.append(0);
-				}
-				hexstr.append(shaHex);
-			}
-			return hexstr.toString();
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new AesException(AesException.ComputeSignatureError);
-		}
-	}
-}

+ 0 - 292
fs-company-app/src/main/java/com/fs/wx/util/WXBizMsgCrypt.java

@@ -1,292 +0,0 @@
-/**
- * 对公众平台发送给公众账号的消息加解密示例代码.
- *
- * @copyright Copyright (c) 1998-2014 Tencent Inc.
- */
-
-// ------------------------------------------------------------------------
-
-/**
- * 针对org.apache.commons.codec.binary.Base64,
- * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本)
- * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi
- */
-package com.fs.wx.util;
-
-import org.apache.commons.codec.binary.Base64;
-
-import javax.crypto.Cipher;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-import java.nio.charset.Charset;
-import java.security.Security;
-import java.util.Arrays;
-import java.util.Random;
-
-/**
- * 提供接收和推送给公众平台消息的加解密接口(UTF8编码的字符串).
- * <ol>
- * 	<li>第三方回复加密消息给公众平台</li>
- * 	<li>第三方收到公众平台发送的消息,验证消息的安全性,并对消息进行解密。</li>
- * </ol>
- * 说明:异常java.security.InvalidKeyException:illegal Key Size的解决方案
- * <ol>
- * 	<li>在官方网站下载JCE无限制权限策略文件(JDK7的下载地址:
- *      http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html</li>
- * 	<li>下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt</li>
- * 	<li>如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件</li>
- * 	<li>如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件</li>
- * </ol>
- */
-public class WXBizMsgCrypt {
-	static Charset CHARSET = Charset.forName("utf-8");
-	Base64 base64 = new Base64();
-	byte[] aesKey;
-	String token;
-	String corpId;
-
-	/**
-	 * 构造函数
-	 * @param token 公众平台上,开发者设置的token
-	 * @param encodingAesKey 公众平台上,开发者设置的EncodingAESKey
-	 * @param corpId 企业的corpid
-	 *
-	 * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
-	 */
-	public WXBizMsgCrypt(String token, String encodingAesKey, String corpId) throws AesException {
-		if (encodingAesKey.length() != 43) {
-			throw new AesException(AesException.IllegalAesKey);
-		}
-
-		this.token = token;
-		this.corpId = corpId;
-		aesKey = Base64.decodeBase64(encodingAesKey + "=");
-	}
-
-	// 生成4个字节的网络字节序
-	byte[] getNetworkBytesOrder(int sourceNumber) {
-		byte[] orderBytes = new byte[4];
-		orderBytes[3] = (byte) (sourceNumber & 0xFF);
-		orderBytes[2] = (byte) (sourceNumber >> 8 & 0xFF);
-		orderBytes[1] = (byte) (sourceNumber >> 16 & 0xFF);
-		orderBytes[0] = (byte) (sourceNumber >> 24 & 0xFF);
-		return orderBytes;
-	}
-
-	// 还原4个字节的网络字节序
-	int recoverNetworkBytesOrder(byte[] orderBytes) {
-		int sourceNumber = 0;
-		for (int i = 0; i < 4; i++) {
-			sourceNumber <<= 8;
-			sourceNumber |= orderBytes[i] & 0xff;
-		}
-		return sourceNumber;
-	}
-
-	// 随机生成16位字符串
-	String getRandomStr() {
-		String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
-		Random random = new Random();
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0; i < 16; i++) {
-			int number = random.nextInt(base.length());
-			sb.append(base.charAt(number));
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * 对明文进行加密.
-	 *
-	 * @param text 需要加密的明文
-	 * @return 加密后base64编码的字符串
-	 * @throws AesException aes加密失败
-	 */
-	String encrypt(String randomStr, String text) throws AesException {
-		ByteGroup byteCollector = new ByteGroup();
-		byte[] randomStrBytes = randomStr.getBytes(CHARSET);
-		byte[] textBytes = text.getBytes(CHARSET);
-		byte[] networkBytesOrder = getNetworkBytesOrder(textBytes.length);
-		byte[] corpidBytes = corpId.getBytes(CHARSET);
-
-		// randomStr + networkBytesOrder + text + corpid
-		byteCollector.addBytes(randomStrBytes);
-		byteCollector.addBytes(networkBytesOrder);
-		byteCollector.addBytes(textBytes);
-		byteCollector.addBytes(corpidBytes);
-
-		// ... + pad: 使用自定义的填充方式对明文进行补位填充
-		byte[] padBytes = PKCS7Encoder.encode(byteCollector.size());
-		byteCollector.addBytes(padBytes);
-
-		// 获得最终的字节流, 未加密
-		byte[] unencrypted = byteCollector.toBytes();
-
-		try {
-			// 设置加密模式为AES的CBC模式
-			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
-			SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES");
-			IvParameterSpec iv = new IvParameterSpec(aesKey, 0, 16);
-			cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
-
-			// 加密
-			byte[] encrypted = cipher.doFinal(unencrypted);
-
-			// 使用BASE64对加密后的字符串进行编码
-			String base64Encrypted = base64.encodeToString(encrypted);
-
-			return base64Encrypted;
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new AesException(AesException.EncryptAESError);
-		}
-	}
-
-	/**
-	 * 对密文进行解密.
-	 *
-	 * @param text 需要解密的密文
-	 * @return 解密得到的明文
-	 * @throws AesException aes解密失败
-	 */
-	String decrypt(String text) throws AesException {
-		byte[] original;
-		try {
-			// 设置解密模式为AES的CBC模式
-			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
-			SecretKeySpec key_spec = new SecretKeySpec(aesKey, "AES");
-			IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));
-			Security.setProperty("crypto.policy", "unlimited");
-			cipher.init(Cipher.DECRYPT_MODE, key_spec, iv);
-
-			// 使用BASE64对密文进行解码
-			byte[] encrypted = Base64.decodeBase64(text);
-
-			// 解密
-			original = cipher.doFinal(encrypted);
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new AesException(AesException.DecryptAESError);
-		}
-
-		String xmlContent, from_corpid;
-		try {
-			// 去除补位字符
-			byte[] bytes = PKCS7Encoder.decode(original);
-
-			// 分离16位随机字符串,网络字节序和corpId
-			byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20);
-
-			int xmlLength = recoverNetworkBytesOrder(networkOrder);
-
-			xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET);
-			from_corpid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length),
-					CHARSET);
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new AesException(AesException.IllegalBuffer);
-		}
-
-		// corpid不相同的情况
-		if (!from_corpid.equals(corpId)) {
-			throw new AesException(AesException.ValidateCorpidError);
-		}
-		return xmlContent;
-
-	}
-
-	/**
-	 * 将公众平台回复用户的消息加密打包.
-	 * <ol>
-	 * 	<li>对要发送的消息进行AES-CBC加密</li>
-	 * 	<li>生成安全签名</li>
-	 * 	<li>将消息密文和安全签名打包成xml格式</li>
-	 * </ol>
-	 *
-	 * @param replyMsg 公众平台待回复用户的消息,xml格式的字符串
-	 * @param timeStamp 时间戳,可以自己生成,也可以用URL参数的timestamp
-	 * @param nonce 随机串,可以自己生成,也可以用URL参数的nonce
-	 *
-	 * @return 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串
-	 * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
-	 */
-	public String EncryptMsg(String replyMsg, String timeStamp, String nonce) throws AesException {
-		// 加密
-		String encrypt = encrypt(getRandomStr(), replyMsg);
-
-		// 生成安全签名
-		if (timeStamp == "") {
-			timeStamp = Long.toString(System.currentTimeMillis());
-		}
-
-		String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt);
-
-		// System.out.println("发送给平台的签名是: " + signature[1].toString());
-		// 生成发送的xml
-		String result = XMLParse.generate(encrypt, signature, timeStamp, nonce);
-		return result;
-	}
-
-	/**
-	 * 检验消息的真实性,并且获取解密后的明文.
-	 * <ol>
-	 * 	<li>利用收到的密文生成安全签名,进行签名验证</li>
-	 * 	<li>若验证通过,则提取xml中的加密消息</li>
-	 * 	<li>对消息进行解密</li>
-	 * </ol>
-	 *
-	 * @param msgSignature 签名串,对应URL参数的msg_signature
-	 * @param timeStamp 时间戳,对应URL参数的timestamp
-	 * @param nonce 随机串,对应URL参数的nonce
-	 * @param postData 密文,对应POST请求的数据
-	 *
-	 * @return 解密后的原文
-	 * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
-	 */
-	public String DecryptMsg(String msgSignature, String timeStamp, String nonce, String postData)
-			throws AesException {
-
-		// 密钥,公众账号的app secret
-		// 提取密文
-		Object[] encrypt = XMLParse.extract(postData);
-
-		// 验证安全签名
-		String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt[1].toString());
-
-		// 和URL中的签名比较是否相等
-		// System.out.println("第三方收到URL中的签名:" + msg_sign);
-		// System.out.println("第三方校验签名:" + signature);
-		if (!signature.equals(msgSignature)) {
-			throw new AesException(AesException.ValidateSignatureError);
-		}
-
-		// 解密
-		String result = decrypt(encrypt[1].toString());
-		return result;
-	}
-
-	/**
-	 * 验证URL
-	 * @param msgSignature 签名串,对应URL参数的msg_signature
-	 * @param timeStamp 时间戳,对应URL参数的timestamp
-	 * @param nonce 随机串,对应URL参数的nonce
-	 * @param echoStr 随机串,对应URL参数的echostr
-	 *
-	 * @return 解密之后的echostr
-	 * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
-	 */
-	public String VerifyURL(String msgSignature, String timeStamp, String nonce, String echoStr)
-			throws AesException {
-
-		Security.setProperty("crypto.policy", "unlimited");
-		String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr);
-
-		if (!signature.equals(msgSignature)) {
-			throw new AesException(AesException.ValidateSignatureError);
-		}
-
-		String result = decrypt(echoStr);
-		return result;
-	}
-
-}

+ 0 - 71
fs-company-app/src/main/java/com/fs/wx/util/XMLParse.java

@@ -1,71 +0,0 @@
-/**
- * 对公众平台发送给公众账号的消息加解密示例代码.
- *
- * @copyright Copyright (c) 1998-2014 Tencent Inc.
- */
-
-// ------------------------------------------------------------------------
-
-package com.fs.wx.util;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import java.io.StringReader;
-
-/**
- * XMLParse class
- *
- * 提供提取消息格式中的密文及生成回复消息格式的接口.
- */
-public  class XMLParse {
-
-	/**
-	 * 提取出xml数据包中的加密消息
-	 * @param xmltext 待提取的xml字符串
-	 * @return 提取出的加密消息字符串
-	 * @throws AesException
-	 */
-	public static Object[] extract(String xmltext) throws AesException     {
-		Object[] result = new Object[3];
-		try {
-			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-			DocumentBuilder db = dbf.newDocumentBuilder();
-			StringReader sr = new StringReader(xmltext);
-			InputSource is = new InputSource(sr);
-			Document document = db.parse(is);
-
-			Element root = document.getDocumentElement();
-			NodeList nodelist1 = root.getElementsByTagName("Encrypt");
-			NodeList nodelist2 = root.getElementsByTagName("ToUserName");
-			result[0] = 0;
-			result[1] = nodelist1.item(0).getTextContent();
-			result[2] = nodelist2.item(0).getTextContent();
-			return result;
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new AesException(AesException.ParseXmlError);
-		}
-	}
-
-	/**
-	 * 生成xml消息
-	 * @param encrypt 加密后的消息密文
-	 * @param signature 安全签名
-	 * @param timestamp 时间戳
-	 * @param nonce 随机字符串
-	 * @return 生成的xml字符串
-	 */
-	public static String generate(String encrypt, String signature, String timestamp, String nonce) {
-
-		String format = "<xml>\n" + "<Encrypt><![CDATA[%1$s]]></Encrypt>\n"
-				+ "<MsgSignature><![CDATA[%2$s]]></MsgSignature>\n"
-				+ "<TimeStamp>%3$s</TimeStamp>\n" + "<Nonce><![CDATA[%4$s]]></Nonce>\n" + "</xml>";
-		return String.format(format, encrypt, signature, timestamp, nonce);
-
-	}
-}

+ 0 - 69
fs-company-app/src/main/java/com/fs/wx/util/XmlConvertUtils.java

@@ -1,69 +0,0 @@
-package com.fs.wx.util;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-import java.io.StringReader;
-import java.io.StringWriter;
-
-public class XmlConvertUtils {
-
-    /**
-     * xml转换成JavaBean
-     *
-     * @param xml xml格式字符串
-     * @param t 待转化的对象
-     * @return 转化后的对象
-     * @throws Exception JAXBException
-     */
-    @SuppressWarnings({ "unchecked" })
-    public static <T> T convertToJavaBean(String xml, Class<T> t) throws Exception {
-        T obj = null;
-        JAXBContext context = JAXBContext.newInstance(t);
-        Unmarshaller unmarshaller = context.createUnmarshaller();
-        obj = (T) unmarshaller.unmarshal(new StringReader(xml));
-        return obj;
-    }
-
-    /**
-     * JavaBean转换成xml
-     * @param obj
-     * @param encoding
-     * @return
-     */
-    public static String convertToXml(Object obj, String encoding) {
-        String result = null;
-        try {
-            JAXBContext context = JAXBContext.newInstance(obj.getClass());
-            Marshaller marshaller = context.createMarshaller();
-//            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-//            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
-            marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
-            StringWriter writer = new StringWriter();
-            marshaller.marshal(obj, writer);
-            result = writer.toString();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        return result;
-    }
-
-//    public static JSONObject xmlToJson(String xml) {
-//        try {
-//            org.json.JSONObject object = XML.toJSONObject(xml);
-//            String jsonData = object.get("response").toString();
-//            JSONObject jsonObject = JSON.parseObject(jsonData);
-//            return jsonObject;
-//			/*JSONObject result = (JSONObject) jsonObject.get("result");
-//			JSONObject upload = (JSONObject) result.get("upload");
-//			String uploadUrl = upload.get("url").toString();
-//			String fildId = upload.get("upload-file-id").toString();*/
-//        } catch (JSONException e) {
-//            e.printStackTrace();
-//            return null;
-//        }
-//    }
-
-
-}

+ 1 - 1
fs-company/src/main/java/com/fs/company/controller/CompanyConfigController.java

@@ -72,4 +72,4 @@ public class CompanyConfigController extends BaseController
 
 
 
-}
+}

+ 11 - 0
fs-company/src/main/java/com/fs/company/controller/CompanyController.java

@@ -14,6 +14,8 @@ import com.fs.core.web.service.TokenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * 企业Controller
  *
@@ -70,4 +72,13 @@ public class CompanyController extends BaseController
         }
         return R.ok().put("data",sms);
     }
+
+    @GetMapping("/getCompanyList")
+    public R getCompanyList()
+    {
+        Company map=new Company();
+        map.setIsDel(0);
+        List<Company> list = companyService.selectCompanyList(map);
+        return R.ok().put("data",list);
+    }
 }

+ 1 - 0
fs-company/src/main/java/com/fs/company/controller/CompanyMoneyLogsController.java

@@ -92,6 +92,7 @@ public class CompanyMoneyLogsController extends BaseController
             List<CompanyMoneyLogsExport1VO> list = companyMoneyLogsService.selectCompanyMoneyLogsExport1VOList(companyMoneyLogs);
             for (CompanyMoneyLogsExport1VO vo : list){
                 vo.setUserPhone(ParseUtils.parsePhone(vo.getUserPhone()));
+                vo.setUserAddress(ParseUtils.parseAddress(vo.getUserAddress()));
             }
             ExcelUtil<CompanyMoneyLogsExport1VO> util = new ExcelUtil<CompanyMoneyLogsExport1VO>(CompanyMoneyLogsExport1VO.class);
             return util.exportExcel(list, "companyMoneyLogs");

+ 185 - 0
fs-service-system/src/main/java/com/fs/common/BeanCopyUtils.java

@@ -0,0 +1,185 @@
+package com.fs.common;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.SimpleCache;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.ReflectUtil;
+import cn.hutool.core.util.StrUtil;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.springframework.cglib.beans.BeanCopier;
+import org.springframework.cglib.beans.BeanMap;
+import org.springframework.cglib.core.Converter;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * bean深拷贝工具(基于 cglib 性能优异)
+ * <p>
+ * 重点 cglib 不支持 拷贝到链式对象
+ * 例如: 源对象 拷贝到 目标(链式对象)
+ * 请区分好`浅拷贝`和`深拷贝`再做使用
+ *
+ * @author admin
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class BeanCopyUtils {
+
+    /**
+     * 单对象基于class创建拷贝
+     *
+     * @param source 数据来源实体
+     * @param desc   描述对象 转换后的对象
+     * @return desc
+     */
+    public static <T, V> V copy(T source, Class<V> desc) {
+        if (ObjectUtil.isNull(source)) {
+            return null;
+        }
+        if (ObjectUtil.isNull(desc)) {
+            return null;
+        }
+        final V target = ReflectUtil.newInstanceIfPossible(desc);
+        return copy(source, target);
+    }
+
+    /**
+     * 单对象基于对象创建拷贝
+     *
+     * @param source 数据来源实体
+     * @param desc   转换后的对象
+     * @return desc
+     */
+    public static <T, V> V copy(T source, V desc) {
+        if (ObjectUtil.isNull(source)) {
+            return null;
+        }
+        if (ObjectUtil.isNull(desc)) {
+            return null;
+        }
+        BeanCopier beanCopier = BeanCopierCache.INSTANCE.get(source.getClass(), desc.getClass(), null);
+        beanCopier.copy(source, desc, null);
+        return desc;
+    }
+
+    /**
+     * 列表对象基于class创建拷贝
+     *
+     * @param sourceList 数据来源实体列表
+     * @param desc       描述对象 转换后的对象
+     * @return desc
+     */
+    public static <T, V> List<V> copyList(List<T> sourceList, Class<V> desc) {
+        if (ObjectUtil.isNull(sourceList)) {
+            return null;
+        }
+        if (CollUtil.isEmpty(sourceList)) {
+            return CollUtil.newArrayList();
+        }
+        return sourceList.stream().map(source -> {
+            V target = ReflectUtil.newInstanceIfPossible(desc);
+            copy(source, target);
+            return target;
+        }).collect(Collectors.toList());
+    }
+
+    /**
+     * bean拷贝到map
+     *
+     * @param bean 数据来源实体
+     * @return map对象
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> Map<String, Object> copyToMap(T bean) {
+        if (ObjectUtil.isNull(bean)) {
+            return null;
+        }
+        return BeanMap.create(bean);
+    }
+
+    /**
+     * map拷贝到bean
+     *
+     * @param map       数据来源
+     * @param beanClass bean类
+     * @return bean对象
+     */
+    public static <T> T mapToBean(Map<String, Object> map, Class<T> beanClass) {
+        if (MapUtil.isEmpty(map)) {
+            return null;
+        }
+        if (ObjectUtil.isNull(beanClass)) {
+            return null;
+        }
+        T bean = ReflectUtil.newInstanceIfPossible(beanClass);
+        return mapToBean(map, bean);
+    }
+
+    /**
+     * map拷贝到bean
+     *
+     * @param map  数据来源
+     * @param bean bean对象
+     * @return bean对象
+     */
+    public static <T> T mapToBean(Map<String, Object> map, T bean) {
+        if (MapUtil.isEmpty(map)) {
+            return null;
+        }
+        if (ObjectUtil.isNull(bean)) {
+            return null;
+        }
+        BeanMap.create(bean).putAll(map);
+        return bean;
+    }
+
+    /**
+     * BeanCopier属性缓存<br>
+     * 缓存用于防止多次反射造成的性能问题
+     *
+     * @author Looly
+     * @since 5.4.1
+     */
+    public enum BeanCopierCache {
+        /**
+         * BeanCopier属性缓存单例
+         */
+        INSTANCE;
+
+        private final SimpleCache<String, BeanCopier> cache = new SimpleCache<>();
+
+        /**
+         * 获得类与转换器生成的key在{@link BeanCopier}的Map中对应的元素
+         *
+         * @param srcClass    源Bean的类
+         * @param targetClass 目标Bean的类
+         * @param converter   转换器
+         * @return Map中对应的BeanCopier
+         */
+        public BeanCopier get(Class<?> srcClass, Class<?> targetClass, Converter converter) {
+            final String key = genKey(srcClass, targetClass, converter);
+            return cache.get(key, () -> BeanCopier.create(srcClass, targetClass, converter != null));
+        }
+
+        /**
+         * 获得类与转换器生成的key
+         *
+         * @param srcClass    源Bean的类
+         * @param targetClass 目标Bean的类
+         * @param converter   转换器
+         * @return 属性名和Map映射的key
+         */
+        private String genKey(Class<?> srcClass, Class<?> targetClass, Converter converter) {
+            final StringBuilder key = StrUtil.builder()
+                .append(srcClass.getName()).append('#').append(targetClass.getName());
+            if (null != converter) {
+                key.append('#').append(converter.getClass().getName());
+            }
+            return key.toString();
+        }
+    }
+
+}

+ 14 - 0
fs-service-system/src/main/java/com/fs/company/vo/CompanyTuiMoneyStatisticsVO.java

@@ -0,0 +1,14 @@
+package com.fs.company.vo;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class CompanyTuiMoneyStatisticsVO {
+    @Excel(name = "员工姓名")
+    String nickName;
+    @Excel(name = "佣金订单数")
+    Integer tuiMoneyCount;
+    @Excel(name = "佣金总金额")
+    Integer tuiMoney;
+}

+ 21 - 0
fs-service-system/src/main/java/com/fs/company/vo/StoreOrderStatisticsVO.java

@@ -0,0 +1,21 @@
+package com.fs.company.vo;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class StoreOrderStatisticsVO {
+    String json;
+    @Excel(name = "数量")
+    BigDecimal num;
+    @Excel(name = "名称")
+    String productName;
+    @Excel(name = "编号")
+    String barCode;
+    @Excel(name = "组合编号")
+    String groupBarCode;
+    @Excel(name = "价格")
+    String price;
+}

+ 4 - 0
fs-service-system/src/main/java/com/fs/erp/domain/ErpGoods.java

@@ -2,6 +2,7 @@ package com.fs.erp.domain;
 
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 @Data
@@ -12,6 +13,9 @@ public class ErpGoods {
     String category_code;
     Integer item_add_attribute;
     Boolean combine;
+    BigDecimal cost_price;
+    BigDecimal sales_price;
+    BigDecimal purchase_price;
     String stock_status_code;
     List<ErpGoodsSku> skus;
     List<ErpCombineItem> combine_item;

+ 0 - 1
fs-service-system/src/main/java/com/fs/erp/domain/ErpGoodsStock.java

@@ -10,5 +10,4 @@ public class ErpGoodsStock {
     String qty;
     String salable_qty;
 
-
 }

+ 1 - 0
fs-service-system/src/main/java/com/fs/erp/service/IErpGoodsService.java

@@ -6,6 +6,7 @@ import com.fs.erp.dto.*;
 
 public interface IErpGoodsService
 {
+
     BaseResponse addGoods(ErpGoods goods);
     ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param);
     ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param);

+ 1 - 0
fs-service-system/src/main/java/com/fs/erp/service/impl/ErpGoodsServiceImpl.java

@@ -55,6 +55,7 @@ public class ErpGoodsServiceImpl implements IErpGoodsService
 
         param.set("sign",CommonUtils.sign(param.toString(),sysConfig.getErpSecret()));
         String result = HttpUtil.post(sysConfig.getErpUrl(), param.toString());
+        System.out.println(result);
         ErpGoodsQueryResponse response=JSONUtil.toBean(result, ErpGoodsQueryResponse.class);
         return response;
     }

+ 17 - 0
fs-service-system/src/main/java/com/fs/huifuPay/config/HuiFuPayConfig.java

@@ -0,0 +1,17 @@
+package com.fs.huifuPay.config;
+
+public interface HuiFuPayConfig {
+//     String appId="wx45cf09091aead547";
+//     String hfProductId="KAZX";
+//     String hfSysId="6666000154053614";
+//     String huifuId="6666000154053614";
+//     String hfRsaPrivateKey="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDCXSl/lLo+aocLLe/9X3MIcP4jPxKKQn0lXa5O7bB1W6tbGwsjlFJxwQt17lWC2IaauzsvA9HSqQbTe+VHnT/QcFXAjKecjpaftih0ZHUSS271MYO52PCIJYHzEpqq5LVWNgcKDc+1rAV3xdBwB6thxUoNVcirRRRRi6wQVGEACYZMGKdZNCX52Fkd3LCLx8zrqZIjGZhnf7FEgE6NPcxSgf/SFgGLvgxZ47D4wGm7JTgyHng4zmSDoz23CkGNAB0WTY6rNEu4bmx4GN+aTeRK6RKgPAaXFpzZRsd3N1TjrJ7dOchp0H68OsyqXL2XoJ2xBTxRi3c3d/8GgzwTnyzHAgMBAAECggEBAIVKfnsP8+l6BMKV7k9Edg8D7kUdrAlFL63AYRmfx7Oz+f+wvCLaRO/eA44MtHfXJfhXDm9fnzVo1VWTUdma7Xh0kVpLG2cyIfnFYljvy5mQQbfFDSEWtV2o20VnLMqlrfZBdvJeJmPgZJ+O+TLbD50tP2uFuOg7p4OE1asdMqhiraoa20HjqleQxcIdqE7t70CxH17g995zEiCu9pDMVlbCntijw7CL5OAwU8C6JOh8CNBWOjDm8cCSEjQoTdskmSoI7RQP5ITH9Ki4IXGPhhLocZdcEWT8D2gTfazn6NdUbVN1xjmsNvHkF0HCnJHHOk1j4LmFylogva1b8aIlW4ECgYEA5ncDXfPkYJxztEpeZ6Ze1e1aLz5eRE9MnCh7LGniyNfb01pQjYYUuZlysVPgkgLY0758JRMS6YN1iNIOrCt/HYGOtVsz5/kbx8kZjkKGGScUTuM7byvb9bmIx6cUbKnBGUoOrqX7uLfrAkwOfOCtNBBR30EqF6mLwQeQIhBqCB0CgYEA1+YrCZ6NCRsTAGaoa9INv5c7yrJsRoTFWhPnG8KNjZ+CDVOTWXoimAmApsfh6Bv+1B0PiVUdzPre8xrIt+bSRE4afaWvr4urQ7Yfy5d6juKtdaLcFl1kGDMjN9vzwdzLgbPG+oIzGGoMHaIN66j8RmxO2gaXfFqM3q3IurIOmzMCgYA8kqE+62BmCBjdFQLVCUQ5w+WFL0ZFe/YtwPIGzVm+4gUz+rPbTpdZ5LvhYaNPnRHyLUmh0O6Sk2ur51HV7KS/U5L3lZ4B5VZo3zEpU9C9AalzxoOTh5qLbhVGLGLQ4JkRFYbgXl3Xwfcxpl3UcpTzbyqlnBH9ICHMPTmjyl6j/QKBgAKmDDkd/NTzxBPpLn/EH+8Nx+oArltfHZyxSdCJXnsyTcIkGFasrOf4ld917EuQrFulz577sFXnbfzFg1jeOA4mdyS7d6BLslouTc2Nmi9OkJo02UZc9vFlDzWMOT1TnBuHPRWtqzrNckCa0FjnxdCHW6BJHGqmIbxJnYDM1mkJAoGASSY+ARpsp1hI/5alXS9PIW2VacR/hz/sqmTpMzNK76AEUUt/glU24qJ3ePHJsTrqVgaP/iNB25Zj3cBUlbov+xCSNU72KukVSkRpB4KadkQPaCAEl6gYcRtoB39zRE3YqoLsxLYIbXsJ9LbV8wwQYwG6aLU3dm1MKe70JHF7+ho=";
+//     String hfRsaPublicKey="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj/FOFFjEFfBKQUJkZ47kbeaF6wbMZ5Bt4jzHmNTtoRqMqWErKPFxoeCUkHGrbzlLpzL0UHFwUD4PO9lLNZQmnibPrdx+mHF51FNzW2h25aSUeyXAwWWTJD1saX1aOKZzOm/411Dwo46cqCzcjVtuMGXiHU8NPho/qiGCkBhri8fVblsQKiRZtoeWGcq7D1JAy4LlSr6tRTLYZTrpaDnte9vKEzD7EpIhyq8+W/j+zrUAVU3fUQbfHNYNbmrZtBVzxSJgbi5aLb+fKfiWrpfKWT32Jqezf5+bi/6he/VupSkmZhUnBoL3sCVQmEX53gmSrH2c1aXbETGR9dlqyE2TJQIDAQAB";
+//     String hfPayNotifyUrl="http://139.186.223.30:7016/app/pay/hfPayNotify";
+//     String hfPayOnlineNotifyUrl="http://nn8e2w.natappfree.cc/huFu/payOnlineNotifyUrl";
+//     String hfRefundNotifyUrl="http://nn8e2w.natappfree.cc/huFu/payOnlineNotifyUrl";
+//     String hfOnlineRefundNotifyUrl="http://nn8e2w.natappfree.cc/huFu/payOnlineNotifyUrl";
+//
+//
+
+}

+ 32 - 0
fs-service-system/src/main/java/com/fs/huifuPay/demo/constants/DemoTestConstants.java

@@ -0,0 +1,32 @@
+/**
+ * 汇付天下有限公司
+ * Copyright (c) 2006-2021 ChinaPnR,Inc.All Rights Reserved.
+ */
+package com.fs.huifuPay.demo.constants;
+
+/**
+ * @author kefeng.zheng
+ * @version v 0.1
+ */
+public class DemoTestConstants {
+    /**
+     * 汇付分配的产品号
+     */
+    public static final String DEMO_PRODUCT_ID = "KAZX";
+    /**
+     * 汇付分配的系统号
+     */
+    public static final String DEMO_SYS_ID = "6666000149635112";
+    /**
+     * 商户进件后获得的商户号
+     */
+    public static final String DEMO_HUIFU_ID = "6666000149635112";
+    /**
+     * 服务商私钥,用于调用接口时进行签名
+     */
+    public static final String DEMO_RSA_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCijLcYLMJEe16TS6BtEG9hUezZyYvp2qgpPVGWaaBbb6lud89ILMUC7jyTWufCo2fUQ0nJzYhVlNeMzmGFtg/zFwhkjJIkuCOW+/Koy1ow66Rom8/sNQLb82szHoeklbv17AnD7WJis7cGyy1+3E6jzfaPOB7PTzidK6KyfCWDByOt0JcGe3+6+9+loQFbFRXJ2RpWPQeN72n9FVtSKSvgkGtJNUzh/qBwMPN6ol6xcU/Z2o1sYrRfKC4tcMqccRi/DvvZFJPVlN+YqkJ6lhgAmJg7eZ2fhIgrmzqc96UKp2YUNm+1v8XHCflD9Wv94E6D2JgL4VbF4Zyf+fKYuR7pAgMBAAECggEAfy5UL6ENmuFgHSVF7y+1xdKA2+IbC60ed63XgTVB12jli15Im3MT7ngSg0TUIvERUv4W5MNgkX10rWHo4eKSViPGWE24JuzAQ+j7cuAwwCgPKh4HMAxGIWwyivuvK7JQL1kwRtEccpekc7dS8HhVO0rySBqj2JZmeGrk0HvcKciSWuMjhjT4dJUwSntD07REV6rVjrpQXuvmY40vH88uvHLdH1IcjmJs2yJRNawUNtd+8FvpOCjami7zpB+er+AQ6S2fvpljNqfE5Kadm3MvzBngDdMS3xRvMHfjCifVwFpLP0rLDP6cSn6PJWbkNYQVZi12w8+wb5f7AVlaKXnfdQKBgQDh7VC5+MOqfcUr9h/n2vhFFhQOaGAZCOBc65n8VBj9aRht8ViXFvRrIRmM+QvUbV9/7taFbtAnZXIzu+12T4vnlZv9DTsy6kKloV5923xZ4CpzIVG8crlwJz1wdALeO6M485RtRLjz6nlNKn2m2VJ1d5XFBDhIz5rWUzagPwwpwwKBgQC4L8Eyu6Yn/zQmv8l6rfAsEfUJzfYtojf1PerPYilARtgFuD20cppcOP5oAk2TTX3qaz0Y9atCfL2z2qxtrgKtw2etfhDBmT6l6+pg04SLuyTrVeZ5dxXHt+LRLJnvBbGgnvAM6rSRKdHXT0gfqiRIMw2qIUtndgRr4RK5hqcd4wKBgBYBFh620t/VFhIdC6h6VDnuV4+7rLhje+6w57OCwVhVFxMGMZmtm6qfc6yeSP+sk2OTcINYcp+TqtbNE+i1AKxSjvnLgxuHY2xcViat7OOYCKpj8WEIT3VT7RD5y5m3d0NBvhASZG0lRiE05T4N5pEYT5b7vTuiNLNxMV3UJiwfAoGBAIb2/1QEqwmN+RIX4TSTNnWkpvELSkRAJU8Akwpp/J5MC0mNqzGJ9NB1Nv7SCTRSSV04PaoHgvoSXBPpvgYUx4O6t0MrKG4ktAJzL+jJtcuKU9Bavqrs9znE5mCulRHQE0wGixJ7/dqNUWW7g7coPrPlLTMoeI+UrEK8x7LJF7ZPAoGALHvtu6zzWVeCdELIPUTersVQrH1R3yZuf6rgubg4XFw3meFcd4W8BvXm4EKGRZxdiyZvCtKlkV9u110Rx3RNSbZCOb3MClmkcow8vPIhmyGWIGymAIxr9JcD0p6HogzPvbjRsLh1nFg/+95OL2E353Bp4/oPIgYIfnYNUfD+0gA=";
+    /**
+     * 汇付公钥,用于对汇付返回报文进行签名验证
+     */
+    public static final String DEMO_RSA_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjbkiiy2ewzuPsM5uZbAFMJOBWCRRQ2RtH7Dbr9Evbow6IEyvGoen8XKpiuXzapeps3b2eogETHVFQtLooqRHpVRppFKtU1AHZXA7C6wPocfMldJbTykDCowyJwOSYEaFPBjr9cw6dQcBJMIEHj0YWjBPR1dPVzf+y4sUohbrkS/FANBpp24j+Mu0qEqh8TuVuKlvig7jbmXJiJkAmUJ+Tb3Caj20fFTen6juPd3zR/KM3twki06wZZbb4KyCiM/NwozEqJ9PkWSs6rG7aW+BEfzlo3m1a7MlL0vpKNR3f0lbywq09rFAwtA7R2lssWwLMma4LOqtMMqo3yZdv4vObQIDAQAB";
+}

+ 11 - 0
fs-service-system/src/main/java/com/fs/huifuPay/demo/core/Identify.java

@@ -0,0 +1,11 @@
+package com.fs.huifuPay.demo.core;
+
+import java.lang.annotation.*;
+
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Identify {
+    @SuppressWarnings("rawtypes")
+	Class requestClass();
+}

+ 62 - 0
fs-service-system/src/main/java/com/fs/huifuPay/demo/init/BaseCommon.java

@@ -0,0 +1,62 @@
+package com.fs.huifuPay.demo.init;
+
+
+
+import com.fs.huifuPay.sdk.opps.client.BasePayClient;
+import com.fs.huifuPay.sdk.opps.core.BasePay;
+import com.fs.huifuPay.sdk.opps.core.config.MerConfig;
+import com.fs.huifuPay.sdk.opps.core.request.BaseRequest;
+
+import java.io.File;
+import java.util.Map;
+
+/***
+ * @Description 功能描述:公共的参数封装DEMO
+ * @Date 2021/4/19 15:41
+ */
+public class BaseCommon {
+    /***
+     * @Description: 初始化设置商户公共参数(全局只需设置一次)
+     * @param merConfig
+     * @throws Exception
+     * @date: 2021年7月5日17:59:33
+     */
+    public static void doInit(MerConfig merConfig) throws Exception {
+        BasePay.initWithMerConfig(merConfig);
+    }
+
+    /***
+     * @Description: 执行API调用
+     * @param request
+     * @throws Exception  Map<String,Object>
+     * @date: 2021年7月5日17:59:37
+     */
+    public static Map<String, Object> doExecute(BaseRequest request) throws Exception {
+        return BasePayClient.request(request, false);
+    }
+
+    /***
+     * @Description: 执行API调用
+     * @param request 请求参数
+     * @param isPage 是否是页面版本
+     * @throws Exception  Map<String,Object>
+     * @date: 2021年11月12日15:13:56
+     */
+    public static Map<String, Object> doExecute(BaseRequest request, boolean isPage) throws Exception {
+        return BasePayClient.request(request, isPage);
+    }
+
+    /**
+     * 执行API调用
+     *
+     * @param request 请求参数
+     * @param file    待上传文件
+     * @return
+     * @throws Exception
+     */
+    public static Map<String, Object> doExecute(BaseRequest request, File file) throws Exception {
+        return BasePayClient.upload(request, file);
+    }
+
+    public static final String REQUEST_SUCC_CODE = "00000000";
+}

+ 49 - 0
fs-service-system/src/main/java/com/fs/huifuPay/demo/init/OppsMerchantConfigDemo.java

@@ -0,0 +1,49 @@
+/**
+ * 汇付天下有限公司
+ * Copyright (c) 2006-2021 ChinaPnR,Inc.All Rights Reserved.
+ */
+package com.fs.huifuPay.demo.init;
+
+
+
+
+import com.fs.huifuPay.demo.constants.DemoTestConstants;
+import com.fs.huifuPay.sdk.opps.core.BasePay;
+import com.fs.huifuPay.sdk.opps.core.config.MerConfig;
+
+
+/**
+ * 配置实例
+ *
+ * <p>
+ * 使用本SDK需要进行商户配置,配置由汇付分配的产品号、系统号、及对应加签、验签的密钥信息。
+ * </p>
+ *
+ * @author kefeng.zheng
+ * @version v 0.1
+ */
+public class OppsMerchantConfigDemo {
+    public static MerConfig getMerchantConfig() {
+        /** debug 模式,开启后有详细的日志
+         */
+        BasePay.debug = true;
+
+        /**
+         * prodMode 模式,默认为生产模式
+         * MODE_PROD = "prod"; // 生产环境
+         * MODE_TEST = "test"; // 线上联调环境(针对商户联调测试)
+         */
+        BasePay.prodMode = BasePay.MODE_PROD;
+
+        /**
+         * 单商户模式
+         */
+        MerConfig merConfig = new MerConfig();
+        merConfig.setProcutId(DemoTestConstants.DEMO_PRODUCT_ID);
+        merConfig.setSysId(DemoTestConstants.DEMO_SYS_ID);
+        merConfig.setRsaPrivateKey(DemoTestConstants.DEMO_RSA_PRIVATE_KEY);
+        merConfig.setRsaPublicKey(DemoTestConstants.DEMO_RSA_PUBLIC_KEY);
+        merConfig.setHuifuId(DemoTestConstants.DEMO_HUIFU_ID);
+        return merConfig;
+    }
+}

+ 15 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuCloseResult.java

@@ -0,0 +1,15 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuiFuCloseResult {
+    private String org_req_date; // 原请求日期
+    private String org_req_seq_id; // 原请求序列号
+    private String resp_desc; // 响应描述
+    private String trans_stat; // 交易状态
+    private String req_seq_id; // 请求序列号
+    private String req_date; // 请求日期
+    private String resp_code; // 响应代码
+    private String huifu_id; // 汇付ID
+}

+ 22 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuCreateOrder.java

@@ -0,0 +1,22 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuiFuCreateOrder {
+//    T_JSAPI: 微信公众号
+//    T_MINIAPP: 微信小程序
+//    A_JSAPI: 支付宝JS
+//    A_NATIVE: 支付宝正扫
+//    U_NATIVE: 银联正扫
+//    U_JSAPI: 银联JS
+//    D_NATIVE: 数字人民币正扫
+//    T_H5:微信直连H5支付
+//    T_APP:微信APP支付(只支持直连)
+//    T_NATIVE:微信正扫(只支持直连)
+    String tradeType;
+    String reqSeqId;
+    String transAmt;
+    String goodsDesc;
+    String openid;
+}

+ 52 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuOnlinePay.java

@@ -0,0 +1,52 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuiFuOnlinePay {
+    private String resp_code;
+    // 返回描述
+    private String resp_desc;
+    // 请求流水号
+    private String req_seq_id;
+    // 请求日期,日期格式:yyyyMMdd;示例值:20220125
+    private String req_date;
+    // 全局流水号,斗拱全局流水号;示例值:00290TOP1GR210919004230P853ac13262200000
+    private String hf_seq_id;
+    // 产品号;示例值:MCS
+    private String product_id;
+    // 商户号,汇付的商户号,示例值:6666000109812123
+    private String huifu_id;
+    // 商户名称;示例值:上海汇付支付服务公司
+    private String mer_name;
+    // 交易金额,单位元,需保留小数点后两位,示例值:1.00
+    private String trans_amt;
+    // 手续费金额,单位元,需保留小数点后两位,示例值:1.00
+    private String fee_amt;
+    // 交易类型;示例值:3013-网银转账
+    private String trans_type;
+    // 交易完成时间,时间格式:yyyyMMddHHmmss;示例值:20221012132030
+    private String trans_finish_time;
+    // 交易状态,P-处理中,F-失败,S-成功;示例值:S
+    private String trans_stat;
+    // 交易关单状态,P-处理中,F-失败,S-成功;示例值:S
+    private String trans_close_stat;
+    // 用户客户号;示例值:6666000109812123
+    private String user_huifu_id;
+    // 收款方名称;示例值:上海汇付支付支付公司
+    private String certificate_name;
+    // 银行卡号,密文最大长度为2048;使用斗拱公钥做RSA加密;示例值:b9LE5RccVVLChrHgo9lvp……PhWhjKrWg2NPfbe0mkQ==
+    private String bank_card_no;
+    // 入账标识;示例值:YDN23MHD223R63SV;入账标识有效期2个工作日,超时会自动失效需要重新生成
+    private String in_acct_flag;
+    // 账户号,汇付分配的账户号, ①:若用户客户号为空,则用商户号的账户号; ②:若用户客户号有值,则用用户客户号的账户号
+    private String acct_id;
+    // 账务完成时间,时间格式:yyyyMMddHHmmss;示例值:20221012132030
+    private String acct_finish_time;
+    // 银行扩展信息
+    private Object bank_extend_data;
+    // 银行返回码;示例值:
+    private String bank_code;
+    // 银行返回描述;示例值:
+    private String bank_message;
+}

+ 52 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuOnlinePayQueryResult.java

@@ -0,0 +1,52 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuiFuOnlinePayQueryResult {
+    private String resp_code;
+    // 响应描述
+    private String resp_desc;
+    // 汇付ID
+    private String huifu_id;
+    // 请求流水号
+    private String req_seq_id;
+    // 请求日期
+    private String req_date;
+    // 原始请求序列ID
+    private String org_req_seq_id;
+    // 原始请求日期
+    private String org_req_date;
+    // 银行卡号
+    private String bank_card_no;
+    // 入账标识
+    private String in_acct_flag;
+    // 收款方名称
+    private String certificate_name;
+    // 交易开始日期
+    private String trans_start_date;
+    // 交易结束日期
+    private String trans_end_date;
+    // 银行流水号
+    private String bank_seq_id;
+    // 交易金额
+    private String trans_amt;
+    // 银行交易时间
+    private String trans_date_time;
+    // 资金流水状态
+    private String trans_stat;
+    // 交易关单时间
+    private String trans_close_time;
+    // 银行交易备注
+    private String bank_trans_desc;
+    // 付款方银行号
+    private String bank_id;
+    // 银行卡类型
+    private String card_type;
+    // 汇款订单号
+    private String remittance_order_id;
+    // 银行模式
+    private String bank_mode;
+    // 提交页面地址
+    private String form_url;
+}

+ 32 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuOnlinePayResult.java

@@ -0,0 +1,32 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuiFuOnlinePayResult {
+    private String resp_code;
+    // 返回描述
+    private String resp_desc;
+    // 请求流水号
+    private String req_seq_id;
+    // 请求时间,日期格式:yyyyMMdd
+    private String req_date;
+    // 全局流水号,斗拱全局流水号
+    private String hf_seq_id;
+    // 商户号,汇付的商户号
+    private String huifu_id;
+    // 交易金额,单位元,需保留小数点后两位
+    private String trans_amt;
+    // 手续费金额,单位元,需保留小数点后两位
+    private String fee_amt;
+    // 交易状态,P-处理中, F-失败, S-成功
+    private String trans_stat;
+    // 商品描述
+    private String goods_desc;
+    // 商户备注
+    private String remark;
+    // 入账标识,入账标识有效期2个工作日,超时会自动失效需要重新生成
+    private String in_acct_flag;
+    // 提交页面地址
+    private String form_url;
+}

+ 67 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuOnlineRefund.java

@@ -0,0 +1,67 @@
+package com.fs.huifuPay.domain;
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+
+@Data
+public class HuiFuOnlineRefund {
+    private String sub_resp_code;
+    // 业务返回描述
+    private String sub_resp_desc;
+    // 客户号
+    private String huifu_id;
+    // 商户名称
+    private String mer_name;
+    // 请求流水号
+    private String req_seq_id;
+    // 请求日期
+    private String req_date;
+    // 全局流水号
+    private String hf_seq_id;
+    // 交易类型
+    private String trans_type;
+    // 原交易请求流水号
+    private String org_req_seq_id;
+    // 原交易请求日期
+    private String org_req_date;
+    // 交易发生日期
+    private String trans_date;
+    // 交易发生时间
+    private String trans_time;
+    // 原交易订单金额
+    private String org_ord_amt;
+    // 原交易手续费
+    private String org_fee_amt;
+    // 原交易累计退款金额
+    private String total_ref_amt;
+    // 原交易累计退款手续费金额
+    private String total_ref_fee_amt;
+    // 退款金额
+    private String ord_amt;
+    // 分账串
+    private String acct_split_bunch;
+    // 分账手续费信息
+    private JsonObject split_fee_info;
+    // 退款返还手续费
+    private String fee_amt;
+    // 补贴支付信息
+    private String combinedpay_data;
+    // 补贴部分的手续费
+    private String combinedpay_fee_amt;
+    // 交易完成时间
+    private String trans_finish_time;
+    // 交易状态
+    private String trans_stat;
+    // 累计退款次数
+    private String ref_cut;
+    // 银行编号
+    private String bank_id;
+    // 银行名称
+    private String bank_name;
+    // 备注
+    private String remark;
+    // 通道返回码
+    private String bank_code;
+    // 通道返回描述
+    private String bank_message;
+}

+ 55 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuOnlineRefundQueryResult.java

@@ -0,0 +1,55 @@
+package com.fs.huifuPay.domain;
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+
+@Data
+public class HuiFuOnlineRefundQueryResult {
+    // 业务返回码,参见业务返回码;示例值:00000000
+    private String resp_code;
+
+    // 业务返回信息;示例值:查询成功
+    private String resp_desc;
+
+    // 汇付分配的商户号,示例值:6666000109812123
+    private String huifu_id;
+
+    // 原退款全局流水号,示例值:00290TOP1GR210919004230P853ac13262200000
+    private String org_hf_seq_id;
+
+    // 原退款请求日期,格式:yyyyMMdd;示例值:20221023
+    private String org_req_date;
+
+    // 原退款请求流水号,示例值:rQ20211213115651
+    private String org_req_seq_id;
+
+    // 退款金额,单位元,需保留小数点后两位,示例值:10.00
+    private String ord_amt;
+
+    // 退款完成时间,格式:yyyyMMddHHmmss;示例值:20221023142334
+    private String trans_finish_time;
+
+    // 交易状态,P:处理中 S:成功 F:失败;示例值:S
+    private String trans_stat;
+
+    // 手续费金额,单位元,需保留小数点后两位,示例值:0.10
+    private String fee_amt;
+
+    // 分账对象,jsonObject格式;参见分账对象
+    private String acct_split_bunch;
+
+    // 分账手续费信息,jsonObject格式
+    private JsonObject split_fee_info;
+
+    // 补贴支付信息,jsonArray字符串;参见《补贴支付信息》
+    private String combinedpay_data;
+
+    // 补贴部分的手续费,单位元,需保留小数点后两位,示例值:0.05
+    private String combinedpay_fee_amt;
+
+    // 通道返回码,示例值:
+    private String bank_code;
+
+    // 通道返回描述,示例值:
+    private String bank_message;
+}

+ 59 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuOnlineRefundResult.java

@@ -0,0 +1,59 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuiFuOnlineRefundResult {
+    private String resp_code;
+
+    // 业务返回信息;示例值:退款成功
+    private String resp_desc;
+
+    // 产品号,汇付配置的产品号;示例值:YYZY
+    private String product_id;
+
+    // 汇付分配的商户号;示例值:6666000108854952
+    private String huifu_id;
+
+    // 原交易全局流水号;示例值:0035000topA220628152651P306c0a8217a00000
+    private String org_hf_seq_id;
+
+    // 原交易请求日期,格式:yyyyMMdd;示例值:20221112
+    private String org_req_date;
+
+    // 原交易请求流水号;示例值:2021091708126665001
+    private String org_req_seq_id;
+
+    // 请求日期,格式:yyyyMMdd;示例值:20221112
+    private String req_date;
+
+    // 请求流水号;示例值:2021091708126665001
+    private String req_seq_id;
+
+    // 退款金额,单位元,需保留小数点后两位,示例值:1.00
+    private String ord_amt;
+
+    // 手续费金额,单位元,需保留小数点后两位,示例值:1.00
+    private String fee_amt;
+
+    // 退款完成时间,格式:yyyyMMddHHmmss;示例值:20221113203144
+    private String trans_finish_time;
+
+    // 交易状态,P:处理中 S:成功 F:失败;示例值:S
+    private String trans_stat;
+
+    // 分账对象,jsonObject格式;参见分账对象
+    private String acct_split_bunch;
+
+    // 补贴部分的手续费,单位元,需保留小数点后两位,示例值:1.00
+    private String combinedpay_fee_amt;
+
+    // 备注,原样返回;示例值:备注
+    private String remark;
+
+    // 通道返回码,示例值:
+    private String bank_code;
+
+    // 通道返回描述,示例值:
+    private String bank_message;
+}

+ 14 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuPayInfo.java

@@ -0,0 +1,14 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuiFuPayInfo {
+    private String appId;
+    private String timeStamp;
+    private String nonceStr;
+    private String packageValue;
+    private String signType;
+    private String paySign;
+
+}

+ 126 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuQueryOrderResult.java

@@ -0,0 +1,126 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuiFuQueryOrderResult {
+    private String resp_code;
+    // 响应描述
+    private String resp_desc;
+
+    // 交易类型
+    private String trans_type;
+    // 交易状态
+    private String trans_stat; //P:处理中;S:成功;F:失败;I: 初始(初始状态很罕见,请联系汇付技术人员处理);示例值:S
+    // 业务代理ID
+    private String bagent_id;
+    // 汇付ID
+    private String huifu_id;
+    // 原请求日期
+    private String org_req_date;
+    // 原汇付流水号
+    private String org_hf_seq_id;
+    // 原请求流水号
+    private String org_req_seq_id;
+    // 外部交易ID
+    private String out_trans_id;
+    // 交易订单ID
+    private String party_order_id;
+    // 交易金额
+    private String trans_amt;
+    // 支付金额
+    private String pay_amt;
+    // 结算金额
+    private String settlement_amt;
+    // 未确认金额
+    private String unconfirm_amt;
+    // 已确认金额
+    private String confirmed_amt;
+
+    // 交易时间
+    private String trans_time;
+    // 结束时间
+    private String end_time;
+    // 延迟账户标志
+    private String delay_acct_flag;
+    // 账户ID
+    private String acct_id;
+    // 账户日期
+    private String acct_date;
+    // 账户状态
+    private String acct_stat;
+    // 借记类型
+    private String debit_type;
+    // 手续费汇付ID
+    private String fee_huifu_id;
+    // 手续费公式信息
+    private String fee_formula_infos;
+    // 手续费金额
+    private String fee_amt;
+    // 手续费类型
+    private String fee_type;
+    // 微信用户ID
+    private String wx_user_id;
+    // 微信响应
+    private String wx_response;
+    // 支付宝响应
+    private String alipay_response;
+    // 银联响应
+    private String unionpay_response;
+    // 分账标志
+    private String div_flag;
+    // 账户分拆批次
+    private String acct_split_bunch;
+    // 分拆手续费信息
+    private String split_fee_info;
+    // 合并支付数据
+    private String combinedpay_data;
+    // 合并支付手续费金额
+    private String combinedpay_fee_amt;
+    // 交易手续费津贴信息
+    private String trans_fee_allowance_info;
+    // 备注
+    private String remark;
+    // 设备类型
+    private String device_type;
+    // 商户设备位置
+    private String mer_dev_location;
+    // 商户私有信息
+    private String mer_priv;
+    // 授权号
+    private String auth_no;
+    // 交易密码
+    private String password_trade;
+    // 商户名称
+    private String mer_name;
+    // 店铺名称
+    private String shop_name;
+    // 预授权金额
+    private String pre_auth_amt;
+    // 预授权支付金额
+    private String pre_auth_pay_amt;
+    // 原授权号
+    private String org_auth_no;
+    // 预授权汇付流水号
+    private String pre_auth_hf_seq_id;
+    // 预授权支付手续费金额
+    private String pre_auth_pay_fee_amount;
+    // 预授权支付退款手续费金额
+    private String pre_auth_pay_refund_fee_amount;
+    // 原手续费标志
+    private String org_fee_flag;
+    // 原手续费记录类型
+    private String org_fee_rec_type;
+    // 原手续费津贴类型
+    private String org_allowance_type;
+    // 分期渠道
+    private String fq_channels;
+    // 银行代码
+    private String bank_code;
+    // 银行描述
+    private String bank_desc;
+    // ATU子商户ID
+    private String atu_sub_mer_id;
+    // DC响应
+    private String dc_response;
+}

+ 13 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuQueryResult.java

@@ -0,0 +1,13 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuiFuQueryResult {
+    private String org_req_date;
+    private String org_req_seq_id;
+    private String resp_desc;
+    private String resp_code;
+    private String huifu_id;
+    private String trans_type;
+}

+ 46 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuRefundResult.java

@@ -0,0 +1,46 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuiFuRefundResult {
+    private String bank_code;
+    // 原始请求日期
+    private String org_req_date;
+    // 交易日期
+    private String trans_date;
+    // 订单金额
+    private String ord_amt;
+    // 响应描述
+    private String resp_desc;
+    // 交易状态
+    private String trans_stat; //P:处理中、S:成功、F:失败;示例值:S
+    // 原始汇付流水号
+    private String org_hf_seq_id;
+    // 银行消息
+    private String bank_message;
+    // 汇付流水号
+    private String hf_seq_id;
+    // 备注
+    private String remark;
+    // 交易时间
+    private String trans_time;
+    // 实际退款金额
+    private String actual_ref_amt;
+    // 原始请求序列号
+    private String org_req_seq_id;
+    // 请求序列号
+    private String req_seq_id;
+    // 产品ID
+    private String product_id;
+    // 请求日期
+    private String req_date;
+    // 响应代码
+    private String resp_code;
+    // 汇付ID
+    private String huifu_id;
+    // 账户拆分信息
+    private String acct_split_bunch;
+    // 交易完成时间
+    private String trans_finish_time;
+}

+ 88 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuiFuResult.java

@@ -0,0 +1,88 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuiFuResult {
+    private String resp_code;
+    // 业务返回信息
+    private String resp_desc;
+    // 商户号
+    private String huifu_id;
+    // 请求流水号
+    private String req_seq_id;
+    // 请求时间
+    private String req_date;
+    // 交易类型
+    private String trans_type;
+    // 全局流水号
+    private String hf_seq_id;
+    // 用户账单上的交易订单号
+    private String out_trans_id;
+    // 用户账单上的商户订单号
+    private String party_order_id;
+    // 交易金额
+    private String trans_amt;
+    // 消费者实付金额
+    private String pay_amt;
+    // 结算金额
+    private String settlement_amt;
+    // 支付完成时间
+    private String end_time;
+    // 入账时间
+    private String acct_date;
+    // 交易状态
+    private String trans_stat; //S:成功、F:失败,示例值:S
+    // 手续费扣款标志
+    private String fee_flag;
+    // 手续费费率信息
+    private String fee_formula_infos;
+    // 手续费金额
+    private String fee_amount;
+    // 补贴支付的手续费
+    private String combinedpay_fee_amt;
+    // 手续费补贴信息
+    private String trans_fee_allowance_info;
+    // 补贴支付信息
+    private String combinedpay_data;
+    // 借贷记标识
+    private String debit_type;
+    // 是否分账交易
+    private String is_div;
+    // 分账对象
+    private String acct_split_bunch;
+    // 是否延时交易
+    private String is_delay_acct;
+    // 微信用户唯一标识码
+    private String wx_user_id;
+    // 微信返回的响应报文
+    private String wx_response;
+    // 支付宝返回的响应报文
+    private String alipay_response;
+    // 数字货币返回的响应报文
+    private String dc_response;
+    // 银联返回的响应报文
+    private String unionpay_response;
+    // 终端类型
+    private String device_type;
+    // 商户终端定位
+    private String mer_dev_location;
+    // 通道返回码
+    private String bank_code;
+    // 通道返回描述
+    private String bank_message;
+    // 备注
+    private String remark;
+    // 分期资产方式
+    private String fq_channels;
+    // 通知类型
+    private String notify_type;
+    // 分账手续费信息
+    private String split_fee_info;
+    // ATU真实商户号
+    private String atu_sub_mer_id;
+    // 汇付终端号
+    private String devs_id;
+
+
+}

+ 38 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/HuifuCreateOrderResult.java

@@ -0,0 +1,38 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuifuCreateOrderResult {
+    private String bank_code;
+    // 响应描述
+    private String resp_desc;
+    // 交易状态
+    private String trans_stat;
+    // 银行消息
+    private String bank_message;
+    // 汇付流水号
+    private String hf_seq_id;
+    // 备注
+    private String remark;
+    // 交易金额
+    private String trans_amt;
+    // 商户订单号
+    private String party_order_id;
+    // 请求流水号
+    private String req_seq_id;
+    // 请求日期
+    private String req_date;
+    // 响应代码
+    private String resp_code;
+    // 二维码链接
+    private String qr_code;
+    // 交易类型
+    private String trade_type;
+    // 汇付 ID
+    private String huifu_id;
+    // 支付宝子商户 ID
+    private String atu_sub_mer_id;
+    //微信支付参数
+    private String pay_info;
+}

+ 55 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/acctPayQueryResult.java

@@ -0,0 +1,55 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class acctPayQueryResult {
+    // 业务返回码,示例值:00000000
+    private String resp_code;
+
+    // 业务返回描述,示例值:交易成功
+    private String resp_desc;
+
+    // 原交易请求流水号,业务请求流水号(发起余额支付请求流水号);示例值:2022082408452985319884
+    private String org_req_seq_id;
+
+    // 原交易请求日期,格式:yyyyMMdd,示例值:20221013
+    private String org_req_date;
+
+    // 发起方商户号,示例值:6666000108854952
+    private String huifu_id;
+
+    // 支付金额,示例值:23.00
+    private String ord_amt;
+
+    // 分账对象,分账信息,jsonObject字符串。余额支付支持付款给多账户。
+    // 如余额支付100元,支付给A账户60元,支付给B账户40元。
+    private String acct_split_bunch;
+
+    // 出款商户号,示例值:6666000108854953
+    private String out_huifu_id;
+
+    // 原交易全局流水号,汇付返回的流水号;示例值:00470topo1A211015160805P090ac132fef00000
+    private String org_hf_seq_id;
+
+    // 交易状态,P:处理中;S:成功;F:失败;C:完成(灵活用工余额支付特有,需查看分账交易状态);示例值:S
+    private String trans_stat;
+
+    // 交易完成时间,格式:yyyyMMddHHmmss;示例值:20211021163242
+    private String trans_finish_time;
+
+    // 备注,示例值:备注
+    private String remark;
+
+    // 商品描述,示例值:商品描述
+    private String good_desc;
+
+    // 延时标记,是否延时交易,Y为延迟,N为不延迟,不传默认N;示例值:N
+    private String delay_acct_flag;
+
+    // 灵活用工标志,灵活用工标志 Y:灵活用工,N:非灵活用工(默认)
+    private String hyc_flag;
+
+    // 灵活用工代发批次号
+    private String hyc_attach_id;
+}

+ 40 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/acctPayRefundQueryResult.java

@@ -0,0 +1,40 @@
+package com.fs.huifuPay.domain;
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+
+@Data
+public class acctPayRefundQueryResult {
+    // 业务返回码,示例值:00000000
+    private String resp_code;
+
+    // 业务返回描述,示例值:交易成功
+    private String resp_desc;
+
+    // 退款请求流水号,示例值:2022082408452985319884
+    private String org_req_seq_id;
+
+    // 余额支付退款请求日期,格式:yyyyMMdd;示例值:20210917
+    private String org_req_date;
+
+    // 商户号,示例值:6666000109812123
+    private String huifu_id;
+
+    // 产品号,接入时提供;示例值:YYZY
+    private String product_id;
+
+    // 退款金额,需保留小数点后两位,示例值:10.00最低传入0.01
+    private String ord_amt;
+
+    // 交易状态,P:处理中;S:成功;F:失败;示例值:S
+    private String trans_stat;
+
+    // 退款完成时间,格式yyyyMMddHHmmss;示例值:20221023112343
+    private String trans_finish_time;
+
+    // 分账对象,分账信息,JsonObject字符串。
+    private JsonObject acct_split_bunch;
+
+    // 备注,示例值:备注
+    private String remark;
+}

+ 52 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/acctPayRefundResult.java

@@ -0,0 +1,52 @@
+package com.fs.huifuPay.domain;
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+
+@Data
+public class acctPayRefundResult {
+    private String resp_code;
+
+    // 业务返回描述,示例值:交易成功
+    private String resp_desc;
+
+    // 请求流水号,业务请求流水号;示例值:2022082408452985319884
+    private String req_seq_id;
+
+    // 请求日期,格式:yyyyMMdd,示例值:20221013
+    private String req_date;
+
+    // 发起方商户号,示例值:6666000108854952
+    private String huifu_id;
+
+    // 产品号,接入时提供;示例值:YYZY
+    private String product_id;
+
+    // 全局流水号,汇付返回流水号;示例值:00470topo1A211015160805P090ac132fef00000
+    private String hf_seq_id;
+
+    // 退款金额,示例值:20.00
+    private String ord_amt;
+
+    // 原余额支付请求日期,格式:yyyyMMdd;示例值:20221103
+    private String org_req_date;
+
+    // 原余额支付请求流水号,示例值:2022082408452985319883
+    private String org_req_seq_id;
+
+    // 原余额支付支付全局流水号,示例值:00470topo1A211015160805P090ac132fef00001
+    private String org_hf_seq_id;
+
+    // 交易状态,P:处理中;S:成功;F:失败;示例值:S
+    private String trans_stat;
+
+    // 退款完成时间,格式yyyyMMddHHmmss;示例值:20221104132334
+    private String trans_finish_time;
+
+    // 退款分账串,分账信息,JsonObject字符串
+    private JsonObject acct_split_bunch;
+
+    // 备注,示例值:备注
+    private String remark;
+
+}

+ 69 - 0
fs-service-system/src/main/java/com/fs/huifuPay/domain/acctPayResult.java

@@ -0,0 +1,69 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class acctPayResult {
+    private String resp_code;
+
+    // 业务返回描述,示例值:交易成功
+    private String resp_desc;
+
+    // 业务请求流水号,示例值:2022082408452985319884
+    private String req_seq_id;
+
+    // 请求日期。格式:yyyyMMdd,示例值:20221013
+    private String req_date;
+
+    // 发起方商户号,示例值:6666000108854952
+    private String huifu_id;
+
+    // 出款方商户号,示例值:6666000108854953
+    private String out_huifu_id;
+
+    // 支付金额,示例值:200.00
+    private String ord_amt;
+
+    // 分账对象,json格式。余额支付支持付款给多账户。
+    // 如余额支付100元,支付给A账户60元,支付给B账户40元。
+    private String acct_split_bunch;
+
+    // 全局流水号,汇付返回流水号;示例值:00470topo1A211015160805P090ac132fef00000
+    private String hf_seq_id;
+
+    // 商品描述,示例值:商品描述
+    private String good_desc;
+
+    // 交易状态,P:处理中;S:成功;F:失败;示例值:S
+    private String trans_stat;
+
+    // 交易完成时间,余额支付完成时间,格式:yyyyMMddHHmmss;示例值:20211021163242
+    private String trans_finish_time;
+
+    // 备注,示例值:备注
+    private String remark;
+
+    // 出款方账户号,示例值:F00598600
+    private String out_acct_id;
+
+    // 资金类型。支付渠道为中信E管家时,资金类型必填(详见说明)
+    private String fund_type;
+
+    // 支付渠道。HUIFU=汇付账务(默认);ZXE=中信E管家
+    private String acct_channel;
+
+    // 灵活用工标志,Y:灵活用工,N:非灵活用工(默认);示例值:Y
+    private String hyc_flag;
+
+    // 代发模式,1:普票,2:专票。灵活用工标志为Y时必填;示例值:1
+    private String salary_modle_type;
+
+    // 落地公司商户号,灵活用工标志为Y时必填;示例值:6666000109812124
+    private String bmember_id;
+
+    // 灵活用工代发批次号,示例值:
+    private String hyc_attach_id;
+
+    // 手续费承担方标识,余额支付手续费承担方标识;商户余额支付扣收规则为接口指定承担方时必填!枚举值:OUT:出款方;IN:分账接受方。
+    private String trans_fee_take_flag;
+}

+ 152 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/client/BasePayClient.java

@@ -0,0 +1,152 @@
+/**
+ * 汇付天下有限公司
+ * Copyright (c) 2006-2021 ChinaPnR,Inc.All Rights Reserved.
+ */
+package com.fs.huifuPay.sdk.opps.client;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fs.huifuPay.sdk.opps.core.BasePay;
+import com.fs.huifuPay.sdk.opps.core.exception.BasePayException;
+import com.fs.huifuPay.sdk.opps.core.exception.FailureCode;
+import com.fs.huifuPay.sdk.opps.core.net.BasePayRequest;
+import com.fs.huifuPay.sdk.opps.core.request.BaseRequest;
+import com.fs.huifuPay.sdk.opps.core.utils.ObjectUtils;
+import com.fs.huifuPay.sdk.opps.core.utils.StringUtil;
+
+import java.io.File;
+import java.util.Map;
+
+/**
+ * @author kefeng.zheng
+ * @version v 0.1
+ */
+public class BasePayClient {
+
+    /**
+     * 反扫
+     *
+     * @param request
+     * @return
+     * @throws BasePayException
+     * @throws IllegalAccessException
+     */
+    public static Map<String, Object> request(BaseRequest request) throws BasePayException, IllegalAccessException {
+        return request(request, request.getFunctionCode().getCode(), false);
+    }
+
+    public static Map<String, Object> request(BaseRequest request, boolean isPage) throws BasePayException, IllegalAccessException {
+        return request(request, request.getFunctionCode().getCode(), isPage);
+    }
+
+    public static Map<String, Object> request(BaseRequest request, String funcCode, boolean isPage) throws BasePayException, IllegalAccessException {
+        return request(request, funcCode, null, isPage);
+    }
+
+    public static Map<String, Object> request(BaseRequest request, String funcCode, String merchantKey, boolean isPage) throws BasePayException, IllegalAccessException {
+        //1.把requset转为map,适应params<string,Object>
+        Map<String, Object> params = ObjectUtils.objectToMap(request);
+        //2.把reqest.extendInfos 里的键值,覆盖已有的
+        if (request.getExtendInfos() != null && request.getExtendInfos().size() > 0) {
+            params.putAll(request.getExtendInfos());
+        }
+        //3.调用接口
+        return request(params, funcCode, merchantKey, isPage);
+    }
+
+    /**
+     * 使用默认商户配置调用汇付接口
+     *
+     * @param params   接口参数集合
+     * @param funcCode 功能编码
+     * @return 返回参数集合
+     * @throws BasePayException
+     */
+    public static Map<String, Object> request(Map<String, Object> params, String funcCode, boolean isPage) throws BasePayException {
+        return request(params, funcCode, null, isPage);
+    }
+
+    /**
+     * 使用指定商户配置调用汇付接口
+     *
+     * @param params      接口参数集合
+     * @param funcCode    功能编码
+     * @param merchantKey 商户配置名
+     * @return 返回参数集合
+     * @throws BasePayException
+     */
+    public static Map<String, Object> request(Map<String, Object> params, String funcCode, String merchantKey, boolean isPage) throws BasePayException {
+        // 接口名必送检查
+        if (StringUtil.isEmpty(funcCode)) {
+            throw new BasePayException(FailureCode.REQUEST_PARAMETER_ERROR.getFailureCode(), "请指定要调用的接口的功能编码");
+        }
+
+        // 风控字段的特殊处理,如果上送的是对象,则转换为JSON字符串,如果是字符串则保持原样
+        if (params.containsKey("risk_check_data")) {
+            Object riskCheckInfo = params.get("risk_check_data");
+            if (!(riskCheckInfo instanceof String)) {
+                params.put("risk_check_data", JSON.toJSONString(riskCheckInfo));
+            }
+        }
+
+        String interfaceUrl = funcCode.replaceAll("\\.", "/");
+        return BasePayRequest.requestBasePay(interfaceUrl, params, merchantKey, isPage);
+    }
+
+    /**
+     * 文件上传
+     *
+     * @param request 结构参数集合
+     * @param file    要上传的文件对象
+     * @return 文件上传结果
+     * @throws BasePayException
+     */
+    public static Map<String, Object> upload(BaseRequest request, File file) throws BasePayException, IllegalAccessException {
+        //1.把requset转为map,适应params<string,Object>
+        Map<String, Object> params = ObjectUtils.objectToMap(request);
+        //2.把reqest.extendInfos 里的键值,覆盖已有的
+        if (request.getExtendInfos() != null && request.getExtendInfos().size() > 0) {
+            params.putAll(request.getExtendInfos());
+        }
+        if (BasePay.debug) {
+            System.out.println(">>" + JSONObject.toJSONString(params));
+        }
+        //3.调用接口
+        return upload(params, file, request.getFunctionCode().getCode(), null);
+    }
+
+    /**
+     * 文件上传
+     *
+     * @param params   结构参数集合
+     * @param file     要上传的文件对象
+     * @param funcCode 接口功能编码
+     * @return 文件上传结果
+     * @throws BasePayException
+     */
+    public static Map<String, Object> upload(Map<String, Object> params, File file, String funcCode) throws BasePayException {
+        return upload(params, file, funcCode, null);
+    }
+
+    /**
+     * 文件上传
+     *
+     * @param params      结构参数集合
+     * @param file        要上传的文件对象
+     * @param funcCode    要上传的文件对象
+     * @param merchantKey 商户配置名
+     * @return 文件上传结果
+     * @throws BasePayException
+     */
+    public static Map<String, Object> upload(Map<String, Object> params, File file, String funcCode, String merchantKey) throws BasePayException {
+
+        // 接口名必送检查
+        if (StringUtil.isEmpty(funcCode)) {
+            throw new BasePayException(FailureCode.REQUEST_PARAMETER_ERROR.getFailureCode(), "请指定要调用的接口的功能编码");
+        }
+        String interfaceUrl = funcCode.replaceAll("\\.", "/");
+        // isPage true 客户端不做验签操作
+        return BasePayRequest.requestBasePay(interfaceUrl, params, file, "file", merchantKey, true);
+    }
+
+}

+ 108 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/BasePay.java

@@ -0,0 +1,108 @@
+/**
+ * 汇付天下有限公司
+ * Copyright (c) 2006-2021 ChinaPnR,Inc.All Rights Reserved.
+ */
+package com.fs.huifuPay.sdk.opps.core;
+
+import com.fs.huifuPay.sdk.opps.core.config.MerConfig;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author kefeng.zheng
+ * @version v 0.1
+ */
+public class BasePay {
+	/**
+	 * 是否使用默认的httpClient
+	 */
+	public static volatile boolean userDefaultCloseableHttpClient = true;
+	/**
+	 * 调试模式,打开可以输出更多调试日志
+	 */
+	public static volatile boolean debug = true;
+
+
+    public static final String MODE_PROD = "prod"; // 生产环境
+    public static final String MODE_TEST = "test"; // 线上联调环境(针对商户联调测试)
+    public static final String MODE_INNER_TEST = "inner_test"; // 内部测试(针对开发测试使用)
+	/**
+	 * 生产模式
+	 */
+	public static volatile String prodMode = MODE_PROD;
+
+	/**
+	 * 接口生产域名
+	 */
+	public static final String apiBase = "https://api.huifu.com";
+	/**
+	 * 接口集成测试域名
+	 */
+	public static final String apiBaseMock = "https://spin-test.cloudpnr.com";
+	public static final String apiBaseTest = "https://opps-stbmertest.testpnr.com";
+
+	/**
+	 * 汇付固定公钥,当未配置汇付侧发送数据的公私钥时,将默认使用此公钥验签
+	 */
+	public static volatile String HUIFU_DEFAULT_PUBLIC_KEY = "";
+
+	private static volatile Map<String, MerConfig> configMap = new HashMap<String, MerConfig>();
+
+	public static void addMerConfig(MerConfig merConfig, String merchantKey) throws Exception {
+		configMap.put(merchantKey, merConfig);
+	}
+
+	public static void initWithMerConfig(MerConfig merConfig) throws Exception {
+
+		if (merConfig == null) {
+			throw new Exception("配置不能为空");
+		}
+
+		configMap.put("default", merConfig);
+	}
+
+	public static void initWithMerConfigs(Map<String, MerConfig> multiConfigs) throws Exception {
+
+		if (multiConfigs == null) {
+			throw new Exception("配置信息不能为空");
+		}
+		if (multiConfigs.size() > 0) {
+			for (Map.Entry<String, MerConfig> entry : multiConfigs.entrySet()) {
+				try {
+					configMap.put(entry.getKey(), entry.getValue());
+				} catch (Exception e) {
+					System.out.println("初始化校验配置出现错误,常见是秘钥不匹配," + ((MerConfig) entry.getValue()).getSysId());
+				}
+			}
+		} else {
+			throw new Exception("配置信息不能为空");
+		}
+	}
+
+	/***
+	 * @Description: 动态设置参数
+	 * @param huifId 商户号
+	 * @param configs 配置
+	 * @throws Exception
+	 * @author: xianlong.shen
+	 * @date: 2021年6月29日下午6:46:06
+	 */
+	public static void putMerConfigs(String huifId, MerConfig configs) throws Exception {
+
+		if (StringUtils.isBlank(huifId) || null == configs) {
+			throw new Exception("配置信息不能为空");
+		}
+
+		configMap.put(huifId, configs);
+
+	}
+
+	public static MerConfig getConfig(String sysId) {
+		if (sysId == null || "".equals(sysId.trim())) {
+			sysId = "default";
+		}
+		return configMap.get(sysId);
+	}
+}

+ 83 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/config/MerConfig.java

@@ -0,0 +1,83 @@
+/**
+ * 汇付天下有限公司
+ * Copyright (c) 2006-2021 ChinaPnR,Inc.All Rights Reserved.
+ */
+package com.fs.huifuPay.sdk.opps.core.config;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * 商户配置
+ * @author kefeng.zheng
+ * @version v 0.1
+ */
+public class MerConfig
+{
+    /**
+     * 商户私钥,用于商户给交易信息签名
+     */
+    @JSONField(name="rsa_private_key")
+    private String rsaPrivateKey;
+    /**
+     * 公钥,商户用公钥对汇付返回的信息进行验签
+     */
+    @JSONField(name="rsa_public_key")
+    private String rsaPublicKey;
+    /**
+     * 产品号,由汇付分配
+     */
+    @JSONField(name="product_id")
+    private String procutId;
+    /**
+     * 系统号,由汇付分配
+     */
+    @JSONField(name="sys_id")
+    private String sysId;
+
+    /**
+     * 商户号,由汇付分配
+     */
+    @JSONField(name="huifu_id")
+    private String huifuId;
+
+
+    public String getRsaPrivateKey() {
+        return rsaPrivateKey;
+    }
+
+    public void setRsaPrivateKey(String rsaPrivateKey) {
+        this.rsaPrivateKey = rsaPrivateKey;
+    }
+
+    public String getRsaPublicKey() {
+        return rsaPublicKey;
+    }
+
+    public void setRsaPublicKey(String rsaPublicKey) {
+        this.rsaPublicKey = rsaPublicKey;
+    }
+
+    public String getProcutId() {
+        return procutId;
+    }
+
+    public void setProcutId(String procutId) {
+        this.procutId = procutId;
+    }
+
+    public String getSysId() {
+        return sysId;
+    }
+
+    public void setSysId(String sysId) {
+        this.sysId = sysId;
+    }
+
+    public String getHuifuId() {
+        return huifuId;
+    }
+
+    public void setHuifuId(String huifuId) {
+        this.huifuId = huifuId;
+    }
+}

+ 578 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/enums/FunctionCodeEnum.java

@@ -0,0 +1,578 @@
+package com.fs.huifuPay.sdk.opps.core.enums;
+
+/**
+ * @Description: 函数代码枚举
+ * @Author: sdk-generator
+ */
+public enum FunctionCodeEnum {
+    /**
+     * 子账户开通配置
+     */
+    V2_MERCHANT_SETTLE_CONFIG("v2.merchant.settle.config", "子账户开通配置"),
+    /**
+     * 修改子账户配置
+     */
+    V2_MERCHANT_SETTLE_MODIFY("v2.merchant.settle.modify", "修改子账户配置"),
+    /**
+     * 批量交易状态查询
+     */
+    V2_TRADE_TRANSSTAT_QUERY("v2.trade.transstat.query", "批量交易状态查询"),
+    /**
+     * 网银支付接口
+     */
+    V2_TRADE_ONLINEPAYMENT_BANKING_FRONTPAY("v2.trade.onlinepayment.banking.frontpay", "网银支付接口"),
+    /**
+     * 微信支付宝预授权完成撤销
+     */
+    V2_TRADE_PAYMENT_PREAUTHPAYCANCEL_REFUND("v2.trade.payment.preauthpaycancel.refund", "微信支付宝预授权完成撤销"),
+    /**
+     * 微信支付宝预授权完成
+     */
+    V2_TRADE_PREAUTHPAY("v2.trade.preauthpay", "微信支付宝预授权完成"),
+    /**
+     * 微信支付宝预授权撤销
+     */
+    V2_TRADE_PAYMENT_PREAUTHCANCEL_REFUND("v2.trade.payment.preauthcancel.refund", "微信支付宝预授权撤销"),
+    /**
+     * 微信支付宝预授权
+     */
+    V2_TRADE_PREAUTH("v2.trade.preauth", "微信支付宝预授权"),
+    /**
+     * 支付宝申诉提交凭证
+     */
+    V2_MERCHANT_COMPLAINT_SUBMIT_CERTIFICATES("v2.merchant.complaint.submit.certificates", "支付宝申诉提交凭证"),
+    /**
+     * 支付宝申诉查询
+     */
+    V2_MERCHANT_COMPLAINT_QUERY_STATUS("v2.merchant.complaint.query.status", "支付宝申诉查询"),
+    /**
+     * 支付宝申诉请求凭证
+     */
+    V2_MERCHANT_COMPLAINT_REQUEST_CERTIFICATES("v2.merchant.complaint.request.certificates", "支付宝申诉请求凭证"),
+    /**
+     * 支付宝投诉查询
+     */
+    V2_MERCHANT_COMPLAINT_ALI_RISKINFO_QUERY("v2.merchant.complaint.ali.riskinfo.query", "支付宝投诉查询"),
+    /**
+     * 查询投诉协商历史
+     */
+    V2_MERCHANT_COMPLAINT_HISTORY_QUERY("v2.merchant.complaint.history.query", "查询投诉协商历史"),
+    /**
+     * 查询投诉单列表及详情
+     */
+    V2_MERCHANT_COMPLAINT_LIST_INFO_QUERY("v2.merchant.complaint.list.info.query", "查询投诉单列表及详情"),
+    /**
+     * 图片下载
+     */
+    V2_MERCHANT_COMPLAINT_DOWNLOAD_PICTURE("v2.merchant.complaint.download.picture", "图片下载"),
+    /**
+     * 更新退款审批结果
+     */
+    V2_MERCHANT_COMPLAINT_UPDATE_REFUNDPROGRESS("v2.merchant.complaint.update.refundprogress", "更新退款审批结果"),
+    /**
+     * 回复用户
+     */
+    V2_MERCHANT_COMPLAINT_REPLY("v2.merchant.complaint.reply", "回复用户"),
+    /**
+     * 反馈处理完成
+     */
+    V2_MERCHANT_COMPLAINT_COMPLETE("v2.merchant.complaint.complete", "反馈处理完成"),
+    /**
+     * 商户统一进件(页面版)
+     */
+    V2_MERCHANT_URL_FORWARD("v2.merchant.url.forward", "商户统一进件(页面版)"),
+    /**
+     * 商户微信支付宝ID查询
+     */
+    V2_MERCHANT_BUSI_MERCODE_QUERY("v2.merchant.busi.mercode.query", "商户微信支付宝ID查询"),
+    /**
+     * 银行转账资金流水查询
+     */
+    V2_TRADE_ONLINEPAYMENT_TRANSFER_ACCOUNT_QUERY("v2.trade.onlinepayment.transfer.account.query", "银行转账资金流水查询"),
+    /**
+     * 银行大额转账关单
+     */
+    V2_TRADE_ONLINEPAYMENT_TRANSFER_ACCOUNT_CLOSE("v2.trade.onlinepayment.transfer.account.close", "银行大额转账关单"),
+    /**
+     * 银行大额转账
+     */
+    V2_TRADE_ONLINEPAYMENT_TRANSFER_ACCOUNT("v2.trade.onlinepayment.transfer.account", "银行大额转账"),
+    /**
+     * 银行卡代发
+     */
+    V2_TRADE_SETTLEMENT_SURROGATE("v2.trade.settlement.surrogate", "银行卡代发"),
+    /**
+     * 微信代发查询
+     */
+    V2_TRADE_TRANS_WXSURROGATE_QUERY("v2.trade.trans.wxsurrogate.query", "微信代发查询"),
+    /**
+     * 微信代发
+     */
+    V2_TRADE_TRANS_WX_SURROGATE("v2.trade.trans.wx.surrogate", "微信代发"),
+    /**
+     * 商户状态变更
+     */
+    V2_MERCHANT_BUSI_MODIFY_BUSISTATUS("v2.merchant.busi.modify.busistatus", "商户状态变更"),
+    /**
+     * 服务商终端列表查询
+     */
+    V2_TERMINALDEVICE_MANAGE_QUERY("v2.terminaldevice.manage.query", "服务商终端列表查询"),
+    /**
+     * 终端解绑
+     */
+    V2_TERMINALDEVICE_MANAGE_UNBIND("v2.terminaldevice.manage.unbind", "终端解绑"),
+    /**
+     * 终端绑定
+     */
+    V2_TERMINALDEVICE_MANAGE_BIND("v2.terminaldevice.manage.bind", "终端绑定"),
+    /**
+     * 手续费试算
+     */
+    V2_TRADE_FEECALC("v2.trade.feecalc", "手续费试算"),
+    /**
+     * 支付宝实名申请提交
+     */
+    V2_MERCHANT_BUSI_ALI_REALNAME_APPLY("v2.merchant.busi.ali.realname.apply", "支付宝实名申请提交"),
+    /**
+     * 支付宝实名申请单查询
+     */
+    V2_MERCHANT_BUSI_ALI_REALNAME_QUERY("v2.merchant.busi.ali.realname.query", "支付宝实名申请单查询"),
+    /**
+     * 图片上传
+     */
+    V2_SUPPLEMENTARY_PICTURE("v2.supplementary.picture", "图片上传"),
+    /**
+     * 用户业务入驻修改
+     */
+    V2_USER_BUSI_MODIFY("v2.user.busi.modify", "用户业务入驻修改"),
+    /**
+     * 用户业务入驻
+     */
+    V2_USER_BUSI_OPEN("v2.user.busi.open", "用户业务入驻"),
+    /**
+     * 用户信息查询
+     */
+    V2_USER_BASICDATA_QUERY("v2.user.basicdata.query", "用户信息查询"),
+    /**
+     * 企业用户基本信息开户
+     */
+    V2_USER_BASICDATA_ENT("v2.user.basicdata.ent", "企业用户基本信息开户"),
+    /**
+     * 企业用户基本信息修改
+     */
+    V2_USER_BASICDATA_ENT_MODIFY("v2.user.basicdata.ent.modify", "企业用户基本信息修改"),
+    /**
+     * 个人用户基本信息开户
+     */
+    V2_USER_BASICDATA_INDV("v2.user.basicdata.indv", "个人用户基本信息开户"),
+    /**
+     * 个人用户基本信息修改
+     */
+    V2_USER_BASICDATA_INDV_MODIFY("v2.user.basicdata.indv.modify", "个人用户基本信息修改"),
+    /**
+     * 快捷支付页面版接口
+     */
+    V2_TRADE_ONLINEPAYMENT_QUICKPAY_PAGEINFO("v2.trade.onlinepayment.quickpay.pageinfo", "快捷支付页面版接口"),
+    /**
+     * 直付通分账关系查询
+     */
+    V2_MERCHANT_DIRECT_ZFT_RECEIVER_QUERY("v2.merchant.direct.zft.receiver.query", "直付通分账关系查询"),
+    /**
+     * 直付通分账关系绑定解绑
+     */
+    V2_MERCHANT_DIRECT_ZFT_RECEIVER_CONFIG("v2.merchant.direct.zft.receiver.config", "直付通分账关系绑定解绑"),
+    /**
+     * 终端自助申请单创建
+     */
+    V2_TERMINALDEVICE_ORDER_CREATE("v2.terminaldevice.order.create", "终端自助申请单创建"),
+    /**
+     * 终端申请列表查询
+     */
+    V2_TERMINALDEVICE_ORDER_QUERY("v2.terminaldevice.order.query", "终端申请列表查询"),
+    /**
+     * 终端申请订单详情
+     */
+    V2_TERMINALDEVICE_ORDER_DETAIL("v2.terminaldevice.order.detail", "终端申请订单详情"),
+    /**
+     * 终端申请订单取消
+     */
+    V2_TERMINALDEVICE_ORDER_CANCEL("v2.terminaldevice.order.cancel", "终端申请订单取消"),
+    /**
+     * 查询商户或渠道商销售策略
+     */
+    V2_TERMINALDEVICE_ORDER_SALESSTRATEGY("v2.terminaldevice.order.salesstrategy", "查询商户或渠道商销售策略"),
+    /**
+     * 注销终端
+     */
+    V2_TERMINALDEVICE_DEVICEINFO_CANCEL("v2.terminaldevice.deviceInfo.cancel", "注销终端"),
+    /**
+     * 新增终端报备
+     */
+    V2_TERMINALDEVICE_DEVICEINFO_ADD("v2.terminaldevice.deviceInfo.add", "新增终端报备"),
+    /**
+     * 绑定终端信息查询
+     */
+    V2_TERMINALDEVICE_DEVICEINFO_QUERY("v2.terminaldevice.deviceInfo.query", "绑定终端信息查询"),
+    /**
+     * 银联活动商户信息查询
+     */
+    V2_MERCHANT_ACTIVITY_UNIONPAY_MERBASEINFO_QUERY("v2.merchant.activity.unionpay.merbaseInfo.query", "银联活动商户信息查询"),
+    /**
+     * 银联活动商户入驻状态查询
+     */
+    V2_MERCHANT_ACTIVITY_UNIONPAY_REGISTE_STATUS_QUERY("v2.merchant.activity.unionpay.registe.status.query", "银联活动商户入驻状态查询"),
+    /**
+     * 银联活动商户入驻
+     */
+    V2_MERCHANT_ACTIVITY_UNIONPAY_MERBASEINFO_APPLY("v2.merchant.activity.unionpay.merbaseInfo.apply", "银联活动商户入驻"),
+    /**
+     * 银联活动列表查询
+     */
+    V2_MERCHANT_ACTIVITY_UNIONPAY_QUERY("v2.merchant.activity.unionpay.query", "银联活动列表查询"),
+    /**
+     * 银联活动报名进度查询
+     */
+    V2_MERCHANT_ACTIVITY_UNIONPAY_SIGN_STATUS("v2.merchant.activity.unionpay.sign.status", "银联活动报名进度查询"),
+    /**
+     * 银联活动报名
+     */
+    V2_MERCHANT_ACTIVITY_UNIONPAY_SIGN("v2.merchant.activity.unionpay.sign", "银联活动报名"),
+    /**
+     * 线上交易退款查询
+     */
+    V2_TRADE_ONLINEPAYMENT_REFUND_QUERY("v2.trade.onlinepayment.refund.query", "线上交易退款查询"),
+    /**
+     * 线上交易退款
+     */
+    V2_TRADE_ONLINEPAYMENT_REFUND("v2.trade.onlinepayment.refund", "线上交易退款"),
+    /**
+     * 线上交易查询
+     */
+    V2_TRADE_ONLINEPAYMENT_QUERY("v2.trade.onlinepayment.query", "线上交易查询"),
+    /**
+     * 网银支持银行列表查询
+     */
+    V2_TRADE_ONLINEPAYMENT_BANKPAY_BANKLIST("v2.trade.onlinepayment.bankpay.banklist", "网银支持银行列表查询"),
+    /**
+     * 网银支付
+     */
+    V2_TRADE_ONLINEPAYMENT_BANKPAY_PAGEINFO("v2.trade.onlinepayment.bankpay.pageinfo", "网银支付"),
+    /**
+     * 手机WAP支付
+     */
+    V2_TRADE_ONLINEPAYMENT_WAPPAY("v2.trade.onlinepayment.wappay", "手机WAP支付"),
+    /**
+     * 网银付款银行账户查询
+     */
+    V2_TRADE_ONLINEPAYMENT_BANKPAY_PAYERQUERY("v2.trade.onlinepayment.bankpay.payerquery", "网银付款银行账户查询"),
+    /**
+     * 微信用户标识查询接口
+     */
+    V2_TRADE_WXUSERMARK_QUERY("v2.trade.wxusermark.query", "微信用户标识查询接口"),
+    /**
+     * 银联统一在线收银台接口
+     */
+    V2_TRADE_ONLINEPAYMENT_UNIONPAY("v2.trade.onlinepayment.unionpay", "银联统一在线收银台接口"),
+    /**
+     * 获取银联用户标识接口
+     */
+    V2_TRADE_PAYMENT_USERMARK2_QUERY("v2.trade.payment.usermark2.query", "获取银联用户标识接口"),
+    /**
+     * 交易退款查询接口
+     */
+    V2_TRADE_PAYMENT_SCANPAY_REFUNDQUERY("v2.trade.payment.scanpay.refundquery", "交易退款查询接口"),
+    /**
+     * 扫码交易退款
+     */
+    V2_TRADE_PAYMENT_SCANPAY_REFUND("v2.trade.payment.scanpay.refund", "扫码交易退款"),
+    /**
+     * 交易关单接口
+     */
+    V2_TRADE_PAYMENT_SCANPAY_CLOSE("v2.trade.payment.scanpay.close", "交易关单接口"),
+    /**
+     * 交易查询接口
+     */
+    V2_TRADE_PAYMENT_SCANPAY_QUERY("v2.trade.payment.scanpay.query", "交易查询接口"),
+    /**
+     * 交易确认退款接口
+     */
+    V2_TRADE_PAYMENT_DELAYTRANS_CONFIRMREFUND("v2.trade.payment.delaytrans.confirmrefund", "交易确认退款接口"),
+    /**
+     * 交易确认查询接口
+     */
+    V2_TRADE_PAYMENT_DELAYTRANS_CONFIRMQUERY("v2.trade.payment.delaytrans.confirmquery", "交易确认查询接口"),
+    /**
+     * 交易确认接口
+     */
+    V2_TRADE_PAYMENT_DELAYTRANS_CONFIRM("v2.trade.payment.delaytrans.confirm", "交易确认接口"),
+    /**
+     * 交易关单查询接口
+     */
+    V2_TRADE_PAYMENT_SCANPAY_CLOSEQUERY("v2.trade.payment.scanpay.closequery", "交易关单查询接口"),
+    /**
+     * 聚合正扫接口
+     */
+    V2_TRADE_PAYMENT_JSPAY("v2.trade.payment.jspay", "聚合正扫接口"),
+    /**
+     * 聚合反扫接口
+     */
+    V2_TRADE_PAYMENT_MICROPAY("v2.trade.payment.micropay", "聚合反扫接口"),
+    /**
+     * 交易分账明细查询接口
+     */
+    V2_TRADE_TRANS_SPLIT_QUERY("v2.trade.trans.split.query", "交易分账明细查询接口"),
+    /**
+     * 电子回单查询
+     */
+    V2_TRADE_PAYMENT_GETELECTRONICRECEIPT("v2.trade.payment.getelectronicreceipt", "电子回单查询"),
+    /**
+     * 卡bin信息查询
+     */
+    V2_TRADE_CARDBIN_QUERY("v2.trade.cardbin.query", "卡bin信息查询"),
+    /**
+     * 余额支付
+     */
+    V2_TRADE_ACCTPAYMENT_PAY("v2.trade.acctpayment.pay", "余额支付"),
+    /**
+     * 余额支付退款查询
+     */
+    V2_TRADE_ACCTPAYMENT_REFUND_QUERY("v2.trade.acctpayment.refund.query", "余额支付退款查询"),
+    /**
+     * 余额支付退款
+     */
+    V2_TRADE_ACCTPAYMENT_REFUND("v2.trade.acctpayment.refund", "余额支付退款"),
+    /**
+     * 余额支付查询
+     */
+    V2_TRADE_ACCTPAYMENT_PAY_QUERY("v2.trade.acctpayment.pay.query", "余额支付查询"),
+    /**
+     * 账务流水查询
+     */
+    V2_TRADE_ACCTPAYMENT_ACCTLOG_QUERY("v2.trade.acctpayment.acctlog.query", "账务流水查询"),
+    /**
+     * 直付通商户入驻
+     */
+    V2_MERCHANT_DIRECT_ZFT_REG("v2.merchant.direct.zft.reg", "直付通商户入驻"),
+    /**
+     * 支付宝直连-查询申请状态
+     */
+    V2_MERCHANT_DIRECT_ALIPAY_APPLYORDERSTATUS_QUERY("v2.merchant.direct.alipay.applyorderstatus.query", "支付宝直连-查询申请状态"),
+    /**
+     * 支付宝直连-换取应用授权令牌
+     */
+    V2_MERCHANT_DIRECT_ALIPAY_APPAUTHTOKEN_EXCHANGE("v2.merchant.direct.alipay.appauthtoken.exchange", "支付宝直连-换取应用授权令牌"),
+    /**
+     * 支付宝直连-申请当面付代签约
+     */
+    V2_MERCHANT_DIRECT_ALIPAY_FACETOFACESIGN_APPLY("v2.merchant.direct.alipay.facetofacesign.apply", "支付宝直连-申请当面付代签约"),
+    /**
+     * 证书登记
+     */
+    V2_MERCHANT_DIRECT_CERTINFO_ADD("v2.merchant.direct.certinfo.add", "证书登记"),
+    /**
+     * 微信直连-修改微信结算帐号
+     */
+    V2_MERCHANT_DIRECT_WECHAT_SETTLEMENTINFO_MODIFY("v2.merchant.direct.wechat.settlementInfo.modify", "微信直连-修改微信结算帐号"),
+    /**
+     * 微信特约商户进件
+     */
+    V2_MERCHANT_DIRECT_WECHAT_SIGN("v2.merchant.direct.wechat.sign", "微信特约商户进件"),
+    /**
+     * 微信直连-微信关注配置查询
+     */
+    V2_MERCHANT_DIRECT_WECHAT_SUBSCRIBE_QUERY("v2.merchant.direct.wechat.subscribe.query", "微信直连-微信关注配置查询"),
+    /**
+     * 微信直连-微信关注配置
+     */
+    V2_MERCHANT_DIRECT_WECHAT_SUBSCRIBE_CONFIG("v2.merchant.direct.wechat.subscribe.config", "微信直连-微信关注配置"),
+    /**
+     * 查询微信申请状态
+     */
+    V2_MERCHANT_DIRECT_WECHAT_QUERY("v2.merchant.direct.wechat.query", "查询微信申请状态"),
+    /**
+     * 微信直连-查询微信结算账户
+     */
+    V2_MERCHANT_DIRECT_WECHAT_SETTLEMENTINFO_QUERY("v2.merchant.direct.wechat.settlementInfo.query", "微信直连-查询微信结算账户"),
+    /**
+     * 商户业务开通修改
+     */
+    V2_MERCHANT_BUSI_MODIFY("v2.merchant.busi.modify", "商户业务开通修改"),
+    /**
+     * 商户业务开通
+     */
+    V2_MERCHANT_BUSI_OPEN("v2.merchant.busi.open", "商户业务开通"),
+    /**
+     * 快捷支付申请
+     */
+    V2_TRADE_ONLINEPAYMENT_QUICKPAY_APPLY("v2.trade.onlinepayment.quickpay.apply", "快捷支付申请"),
+    /**
+     * 快捷支付确认
+     */
+    V2_TRADE_ONLINEPAYMENT_QUICKPAY_CONFIRM("v2.trade.onlinepayment.quickpay.confirm", "快捷支付确认"),
+    /**
+     * 新增快捷/代扣解绑接口
+     */
+    V2_QUICKBUCKLE_UNBIND("v2.quickbuckle.unbind", "新增快捷/代扣解绑接口"),
+    /**
+     * 更新花呗分期方案
+     */
+    V2_PCREDIT_SOLUTION_MODIFY("v2.pcredit.solution.modify", "更新花呗分期方案"),
+    /**
+     * 快捷绑卡申请接口
+     */
+    V2_QUICKBUCKLE_APPLY("v2.quickbuckle.apply", "快捷绑卡申请接口"),
+    /**
+     * 快捷绑卡确认接口
+     */
+    V2_QUICKBUCKLE_CONFIRM("v2.quickbuckle.confirm", "快捷绑卡确认接口"),
+    /**
+     * 账户余额信息查询接口
+     */
+    V2_TRADE_ACCTPAYMENT_BALANCE_QUERY("v2.trade.acctpayment.balance.query", "账户余额信息查询接口"),
+    /**
+     * 交易结算对账单配置查询
+     */
+    V2_MERCHANT_BUSI_BILL_QUERY("v2.merchant.busi.bill.query", "交易结算对账单配置查询"),
+    /**
+     * 交易结算对账文件配置
+     */
+    V2_MERCHANT_BUSI_BILL_CONFIG("v2.merchant.busi.bill.config", "交易结算对账文件配置"),
+    /**
+     * 交易结算对账单查询
+     */
+    V2_TRADE_CHECK_FILEQUERY("v2.trade.check.filequery", "交易结算对账单查询"),
+    /**
+     * 交易结算对账文件重新生成
+     */
+    V2_TRADE_CHECK_REPLAY("v2.trade.check.replay", "交易结算对账文件重新生成"),
+    /**
+     * 商户分期配置详情查询
+     */
+    V2_PCREDIT_FEE_DETAIL("v2.pcredit.fee.detail", "商户分期配置详情查询"),
+    /**
+     * 商户分期配置
+     */
+    V2_PCREDIT_FEE_CONFIG("v2.pcredit.fee.config", "商户分期配置"),
+    /**
+     * 银行卡分期支持银行查询
+     */
+    V2_TRADE_BANKINSTALLMENTINFO_QUERY("v2.trade.bankinstallmentinfo.query", "银行卡分期支持银行查询"),
+    /**
+     * 分期证书配置
+     */
+    V2_PCREDIT_CERTIFICATE_CONFIG("v2.pcredit.certificate.config", "分期证书配置"),
+    /**
+     * 花呗分期活动查询
+     */
+    V2_PCREDIT_SOLUTION_QUERY("v2.pcredit.solution.query", "花呗分期活动查询"),
+    /**
+     * 上架下架分期活动接口
+     */
+    V2_PCREDIT_STATUE_MODIFY("v2.pcredit.statue.modify", "上架下架分期活动接口"),
+    /**
+     * 花呗分期贴息查询
+     */
+    V2_PCREDIT_ORDER_QUERY("v2.pcredit.order.query", "花呗分期贴息查询"),
+    /**
+     * 创建花呗分期方案
+     */
+    V2_PCREDIT_SOLUTION_CREATE("v2.pcredit.solution.create", "创建花呗分期方案"),
+    /**
+     * 商户分账配置查询
+     */
+    V2_MERCHANT_SPLIT_QUERY("v2.merchant.split.query", "商户分账配置查询"),
+    /**
+     * 商户分账配置
+     */
+    V2_MERCHANT_SPLIT_CONFIG("v2.merchant.split.config", "商户分账配置"),
+    /**
+     * 支付宝小程序预下单接口
+     */
+    V2_TRADE_HOSTING_PAYMENT_PREORDER("v2.trade.hosting.payment.preorder", "支付宝小程序预下单接口"),
+    /**
+     * 微信实名认证状态查询
+     */
+    V2_MERCHANT_BUSI_REALNAME_QUERY("v2.merchant.busi.realname.query", "微信实名认证状态查询"),
+    /**
+     * 微信实名认证
+     */
+    V2_MERCHANT_BUSI_REALNAME("v2.merchant.busi.realname", "微信实名认证"),
+    /**
+     * 微信配置查询
+     */
+    V2_MERCHANT_BUSI_CONFIG_QUERY("v2.merchant.busi.config.query", "微信配置查询"),
+    /**
+     * 微信商户配置
+     */
+    V2_MERCHANT_BUSI_CONFIG("v2.merchant.busi.config", "微信商户配置"),
+    /**
+     * 申请单状态查询
+     */
+    V2_MERCHANT_BASICDATA_STATUS_QUERY("v2.merchant.basicdata.status.query", "申请单状态查询"),
+    /**
+     * 商户详细信息查询
+     */
+    V2_MERCHANT_BASICDATA_QUERY("v2.merchant.basicdata.query", "商户详细信息查询"),
+    /**
+     * 商户基本信息修改
+     */
+    V2_MERCHANT_BASICDATA_MODIFY("v2.merchant.basicdata.modify", "商户基本信息修改"),
+    /**
+     * 商户活动报名查询
+     */
+    V2_MERCHANT_ACTIVITY_QUERY("v2.merchant.activity.query", "商户活动报名查询"),
+    /**
+     * 商户活动报名
+     */
+    V2_MERCHANT_ACTIVITY_ADD("v2.merchant.activity.add", "商户活动报名"),
+    /**
+     * 企业商户基本信息入驻
+     */
+    V2_MERCHANT_BASICDATA_ENT("v2.merchant.basicdata.ent", "企业商户基本信息入驻"),
+    /**
+     * 个人商户基本信息入驻
+     */
+    V2_MERCHANT_BASICDATA_INDV("v2.merchant.basicdata.indv", "个人商户基本信息入驻"),
+    /**
+     * 微信支付宝入驻信息修改
+     */
+    V2_MERCHANT_BUSI_AT_MODIFY("v2.merchant.busi.at.modify", "微信支付宝入驻信息修改"),
+    /**
+     * 取现接口
+     */
+    V2_TRADE_SETTLEMENT_ENCHASHMENT("v2.trade.settlement.enchashment", "取现接口"),
+    /**
+     * 结算记录查询
+     */
+    V2_MERCHANT_BASICDATA_SETTLEMENT_QUERY("v2.merchant.basicdata.settlement.query", "结算记录查询"),
+    /**
+     * 出金交易查询接口
+     */
+    V2_TRADE_SETTLEMENT_QUERY("v2.trade.settlement.query", "出金交易查询接口"),
+    /**
+     * 商户统一进件接口
+     */
+    V2_MERCHANT_INTEGRATE_REG("v2.merchant.integrate.reg", "商户统一进件接口"),
+    /**
+     * 商户统一变更接口
+     */
+    V2_MERCHANT_INTEGRATE_UPDATE("v2.merchant.integrate.update", "商户统一变更接口"),
+    ;
+
+    private final String code;
+
+    private final String name;
+
+    FunctionCodeEnum(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 41 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/enums/ServerTypeEnum.java

@@ -0,0 +1,41 @@
+/**
+ * 汇付天下有限公司
+ * Copyright (c) 2006-2021 ChinaPnR,Inc.All Rights Reserved.
+ */
+package com.fs.huifuPay.sdk.opps.core.enums;
+
+/**
+ * @Description: 服务类型枚举
+ * @author: xianlong.shen
+ * @date:2021年6月24日下午6:02:14
+ * @version V1.0
+ * 注意:本内容仅限于公司内部传阅,禁止外泄以及用于其他的商业目的
+ */
+public enum ServerTypeEnum {
+	PAGE("page", "页面系统"), API("api", "api接口");
+
+	private String code;
+	private String desc;
+
+	private ServerTypeEnum(String code, String desc) {
+		this.code = code;
+		this.desc = desc;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public void setDesc(String desc) {
+		this.desc = desc;
+	}
+
+	public String getDesc() {
+		return desc;
+	}
+
+}

+ 55 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/exception/BasePayException.java

@@ -0,0 +1,55 @@
+/**
+ * 汇付天下有限公司
+ * Copyright (c) 2006-2021 ChinaPnR,Inc.All Rights Reserved.
+ */
+package com.fs.huifuPay.sdk.opps.core.exception;
+
+/**
+ * @Description: 基础的异常类
+ * @author: xianlong.shen
+ * @date:2021年6月24日下午6:01:07
+ * @version V1.0 注意:本内容仅限于公司内部传阅,禁止外泄以及用于其他的商业目的
+ */
+public class BasePayException extends Exception {
+	private static final long serialVersionUID = 4159911175795169063L;
+	private String code;
+	private String message;
+
+	public BasePayException(String message) {
+		this.message = message;
+	}
+
+	public BasePayException(String code, String message) {
+		this.message = message;
+		this.code = code;
+	}
+
+	public BasePayException(FailureCode codes) {
+		this.message = codes.getFailureMsg();
+		this.code = codes.getFailureCode();
+	}
+
+	public BasePayException(FailureCode codes, Throwable cause) {
+		super(cause);
+		this.message = codes.getFailureMsg();
+		this.code = codes.getFailureCode();
+	}
+
+	@Override
+	public String getMessage() {
+		return this.message;
+	}
+
+	public String getCode() {
+		return this.code;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder("BasePayException{");
+		sb.append("message='").append(this.message).append('\'');
+		sb.append(", code='").append(this.code).append('\'');
+		sb.append('}');
+		return sb.toString();
+	}
+}

+ 53 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/exception/FailureCode.java

@@ -0,0 +1,53 @@
+/**
+ * 汇付天下有限公司
+ * Copyright (c) 2006-2021 ChinaPnR,Inc.All Rights Reserved.
+ */
+package com.fs.huifuPay.sdk.opps.core.exception;
+
+/**
+ * @author kefeng.zheng
+ * @version v 0.1
+ */
+public enum FailureCode {
+    REQUEST_PARAMETER_ERROR("request_parameter_error", "请求参数错误"),
+    SYSTEM_EXCEPTION("system_exception", "系统异常"),
+    CONFIG_EXCEPTION("config_exception", "配置错误"),
+    SECURITY_EXCEPTION("security_exception", "签名错误"),
+    CHARGE_ID_NOT_EXISTS("charge_id_not_exists", "对应支付记录不存在"),
+    REQUEST_ORDER_NO_REPEATE("request_order_no_repeate", "请求订单号重复"),
+    CHANNEL_ERROR("channel_error", "通道异常"),
+    CHANNEL_RESPONSE_CODE_ERROR("channel_response_code_fail", "支付渠道响应码错误"),
+
+	SOCKET_TIME_EXCEPTION("socket_timeout_exception", "SocketTimeoutException"),
+
+	CONNECT_EXCEPTION("connect_exception", "ConnectException"),
+
+	POST_REQUEST_FALI("post_request_fail", "POST请求失败"),
+
+	POST_REQUEST_FALI_NULL("post_reponse_null", "POST请求返回结果为空");
+
+
+    private String failureCode;
+    private String failureMsg;
+
+    private FailureCode(String failureCode, String failureMsg) {
+        this.failureCode = failureCode;
+        this.failureMsg = failureMsg;
+    }
+
+    public String getFailureCode() {
+        return this.failureCode;
+    }
+
+    public void setFailureCode(String failureCode) {
+        this.failureCode = failureCode;
+    }
+
+    public String getFailureMsg() {
+        return this.failureMsg;
+    }
+
+    public void setFailureMsg(String failureMsg) {
+        this.failureMsg = failureMsg;
+    }
+}

+ 180 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/net/AbstractRequest.java

@@ -0,0 +1,180 @@
+package com.fs.huifuPay.sdk.opps.core.net;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fs.huifuPay.sdk.opps.core.BasePay;
+import com.fs.huifuPay.sdk.opps.core.config.MerConfig;
+import com.fs.huifuPay.sdk.opps.core.enums.ServerTypeEnum;
+import com.fs.huifuPay.sdk.opps.core.exception.BasePayException;
+import com.fs.huifuPay.sdk.opps.core.exception.FailureCode;
+import com.fs.huifuPay.sdk.opps.core.sign.JsonUtils;
+import com.fs.huifuPay.sdk.opps.core.utils.HttpClientUtils;
+import com.fs.huifuPay.sdk.opps.core.utils.RsaUtils;
+import com.fs.huifuPay.sdk.opps.core.utils.StringUtil;
+
+import java.io.File;
+import java.util.*;
+
+/**
+ * 汇付天下有限公司
+ * Copyright (c) 2006-2021 ChinaPnR,Inc.All Rights Reserved.
+ */
+public abstract class AbstractRequest {
+
+    public static final String SDK_VERSION = "3.0.5";
+
+    protected static enum RequestMethod {
+        GET, POST, DELETE, PUT;
+
+        private RequestMethod() {
+        }
+    }
+
+    protected static Map<String, Object> requestBasePayCore(RequestMethod method, String uri, Map<String, Object> params, MerConfig config, boolean isPage)
+            throws BasePayException {
+        return requestBasePayCore(method, uri, params, null, null, config, null, isPage);
+    }
+
+    protected static Map<String, Object> requestBasePayCore(RequestMethod method, String uri, Map<String, Object> params, MerConfig config, ServerTypeEnum serverType, boolean isPage)
+            throws BasePayException {
+        return requestBasePayCore(method, uri, params, null, null, config, serverType, isPage);
+    }
+
+    public static String getUrl() {
+        String baseUrl;
+        switch (BasePay.prodMode) {
+            case BasePay.MODE_TEST:
+                baseUrl = BasePay.apiBaseTest;
+                break;
+            case BasePay.MODE_INNER_TEST:
+                baseUrl = BasePay.apiBaseMock;
+                break;
+            default:
+                baseUrl = BasePay.apiBase;
+                break;
+        }
+        return baseUrl;
+    }
+
+    protected static Map<String, Object> requestBasePayCore(RequestMethod method, String uri, Map<String, Object> params, File file, String fileParam, MerConfig config, ServerTypeEnum serverType, boolean isPage) throws BasePayException {
+        String baseUrl = getUrl();
+        if (ServerTypeEnum.PAGE.equals(serverType)) {
+            baseUrl = getUrl();
+        }
+        StringBuilder requestUrl = new StringBuilder(baseUrl);
+        if (!baseUrl.endsWith("/")) {
+            requestUrl.append("/");
+        }
+        requestUrl.append(uri);
+        String back = null;
+        Map<String, String> headers = new HashMap<>(4);
+        // 传递SDK版本
+        headers.put("sdk_version", "javaSDK_" + SDK_VERSION);
+        // 配置中的商户信息,放入params里
+        Object requestHuifuId = params.get("huifu_id");
+        if (requestHuifuId == null || requestHuifuId.equals("")) {
+            params.put("huifu_id", config.getHuifuId());
+        }
+        String reqData = JSONObject.toJSONString(params);
+
+        String privateKey = config.getRsaPrivateKey();
+        if (BasePay.debug) {
+            System.out.println("PRIVATE_KEY=" + privateKey);
+        }
+        String requestSign;
+        try {
+            String sortedData = JsonUtils.sort4JsonString(reqData, 0);
+            requestSign = RsaUtils.sign(sortedData, privateKey);
+        } catch (Exception e) {
+            if (BasePay.debug) {
+                e.printStackTrace();
+            }
+            requestSign = null;
+        }
+        if ((requestSign == null) || (requestSign.length() == 0)) {
+            throw new BasePayException(FailureCode.SECURITY_EXCEPTION.getFailureCode(), "Sign error. Please check your privateKey.");
+        }
+        if (BasePay.debug) {
+            System.out.println("request sign=" + requestSign);
+        }
+        Map<String, Object> request = new HashMap<>();
+        request.put("sys_id", config.getSysId());
+        request.put("data", JSONObject.parseObject(reqData));
+        request.put("sign", requestSign);
+        request.put("product_id", config.getProcutId());
+
+        String requestBody = JSON.toJSONString(request);
+        if (BasePay.debug) {
+            System.out.println("request data = " + JSONObject.parseObject(reqData));
+            System.out.println("requestBody param = " + requestBody);
+        }
+        if ((RequestMethod.POST == method) && (file == null)) {
+            headers.put("Content-type", "application/json");
+//            back = OkHttpClientTools.httpPost(requestUrl.toString(), requestBody, config.getProcutId());
+            back = HttpClientUtils.httpPostJson(requestUrl.toString(), headers, requestBody);
+        } else if ((RequestMethod.POST == method) && (file != null)) {
+//            back = OkHttpClientTools.httpPostFile(requestUrl.toString(), requestBody, config.getProcutId(),file);
+            back = HttpClientUtils.httpPostFile(requestUrl.toString(), headers, request, file, fileParam);
+        } else if (RequestMethod.GET == method) {
+//            back = OkHttpClientTools.httpGet(requestUrl.toString(), requestBody, config.getProcutId());
+            back = HttpClientUtils.httpGet(requestUrl.toString(), headers, params);
+        }
+        if (BasePay.debug) {
+            System.out.println("response string=" + back);
+        }
+        if ((back == null) || (back.length() == 0)) {
+            throw new BasePayException(FailureCode.SYSTEM_EXCEPTION.getFailureCode(), "Request no response. Please check your network.");
+        }
+        if (BasePay.debug) {
+            System.out.println("Is a version of the page=" + isPage);
+        }
+        if (isPage) {
+            // 页面版本支付,需要将页面直接返回给
+            JSONObject data = new JSONObject();
+            data.put("data", back);
+            return data;
+        }
+
+        JSONObject jo = JSON.parseObject(back);
+        JSONObject data = jo.getJSONObject("data");
+        String sign = jo.getString("sign");
+        String publicKey = config.getRsaPublicKey();
+        if (StringUtil.isEmpty(publicKey)) {
+            publicKey = BasePay.HUIFU_DEFAULT_PUBLIC_KEY;
+        }
+        if (BasePay.debug) {
+            System.out.println("PUBLIC_KEY=" + publicKey);
+            System.out.println("response data=" + data);
+            System.out.println("response sign:" + sign);
+        }
+        boolean checkSign;
+        try {
+            String sortedData = JsonUtils.sort4JsonString(JSONObject.toJSONString(data), 5);
+            checkSign = RsaUtils.verify(sortedData, publicKey, sign);
+        } catch (Exception e) {
+            if (BasePay.debug) {
+                e.printStackTrace();
+            }
+            checkSign = false;
+        }
+        if (!checkSign) {
+            if (BasePay.debug) {
+                System.out.println("验证签名失败");
+            }
+            throw new BasePayException(FailureCode.SECURITY_EXCEPTION.getFailureCode(), "Response sign check error. Please check your pubkey.");
+        }
+        return data;
+    }
+
+    public static String getOriginalStr(Map<String, Object> map) {
+        List<String> listKeys = new ArrayList<>(map.keySet());
+        Collections.sort(listKeys);
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int i = 0; i < listKeys.size(); i++) {
+            if ((map.get(listKeys.get(i)) != null) && (map.get(listKeys.get(i)).toString().length() != 0)) {
+                stringBuilder.append((String) listKeys.get(i)).append("=").append(map.get(listKeys.get(i))).append("&");
+            }
+        }
+        return stringBuilder.length() == 0 ? "" : stringBuilder.toString().substring(0, stringBuilder.length() - 1);
+    }
+}

+ 87 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/net/BasePayRequest.java

@@ -0,0 +1,87 @@
+/**
+ * 汇付天下有限公司
+ * Copyright (c) 2006-2021 ChinaPnR,Inc.All Rights Reserved.
+ */
+package com.fs.huifuPay.sdk.opps.core.net;
+
+import com.fs.huifuPay.sdk.opps.core.BasePay;
+import com.fs.huifuPay.sdk.opps.core.config.MerConfig;
+import com.fs.huifuPay.sdk.opps.core.enums.ServerTypeEnum;
+import com.fs.huifuPay.sdk.opps.core.exception.BasePayException;
+import com.fs.huifuPay.sdk.opps.core.exception.FailureCode;
+
+import java.io.File;
+import java.util.Map;
+
+/**
+ *
+ * @author kefeng.zheng
+ * @version v 0.1
+ */
+public class BasePayRequest
+        extends AbstractRequest {
+    public static Map<String, Object> requestBasePay(String uri, Map<String, Object> params)
+            throws BasePayException {
+        return requestBasePay(uri, params, "default", false);
+    }
+
+    public static Map<String, Object> requestBasePay(String uri, Map<String, Object> params, ServerTypeEnum serverType)
+            throws BasePayException {
+        return requestBasePay(uri, params, "default", serverType,false);
+    }
+
+    public static Map<String, Object> requestBasePay(String uri, Map<String, Object> params, String merchantKey ,boolean isPage)
+            throws BasePayException {
+        return requestBasePay(uri, params, (File) null, (String) null, merchantKey, isPage);
+    }
+
+    public static Map<String, Object> requestBasePay(String uri, Map<String, Object> params, String merchantKey, ServerTypeEnum serverType, boolean isPage)
+            throws BasePayException {
+        return requestBasePay(uri, params, (File) null, (String) null, merchantKey, serverType,isPage);
+    }
+
+    public static Map<String, Object> requestBasePay(String uri, Map<String, Object> params, File file, String fileParam, String merchantKey, boolean isPage)
+            throws BasePayException {
+        return requestBasePay(uri, params, file, fileParam, merchantKey, null, isPage);
+    }
+
+    public static Map<String, Object> requestBasePay(String uri, Map<String, Object> params, File file, String fileParam, String merchantKey, ServerTypeEnum serverType, boolean isPage)
+            throws BasePayException {
+        MerConfig config = BasePay.getConfig(merchantKey);
+        if (null == config) {
+            throw new BasePayException(FailureCode.CONFIG_EXCEPTION.getFailureCode(), "未找到对应" + merchantKey + "商户配置");
+        }
+
+        return requestBasePayCore(RequestMethod.POST, uri, params, file, fileParam, config, serverType, isPage);
+    }
+
+    public static Map<String, Object> getRequestBasePay(String uri, Map<String, Object> params, boolean isPage)
+            throws BasePayException {
+        return getRequestBasePay(uri, params, "default", isPage);
+    }
+
+    public static Map<String, Object> getRequestBasePay(String uri, Map<String, Object> params, ServerTypeEnum serverType, boolean isPage)
+            throws BasePayException {
+        return getRequestBasePay(uri, params, "default", serverType, isPage);
+    }
+
+    public static Map<String, Object> getRequestBasePay(String uri, Map<String, Object> params, String merchantKey, boolean isPage)
+            throws BasePayException {
+        MerConfig config = BasePay.getConfig(merchantKey);
+        if (null == config) {
+            throw new BasePayException(FailureCode.CONFIG_EXCEPTION.getFailureCode(), "未找到对应" + merchantKey + "的商户配置");
+        }
+
+        return requestBasePayCore(RequestMethod.POST, uri, params, config, isPage);
+    }
+
+    public static Map<String, Object> getRequestBasePay(String uri, Map<String, Object> params, String merchantKey, ServerTypeEnum serverType, boolean isPage)
+            throws BasePayException {
+        MerConfig config = BasePay.getConfig(merchantKey);
+        if (null == config) {
+            throw new BasePayException(FailureCode.CONFIG_EXCEPTION.getFailureCode(), "未找到对应" + merchantKey + "的商户配置");
+        }
+
+        return requestBasePayCore(RequestMethod.POST, uri, params, config, serverType, isPage);
+    }
+}

+ 55 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/net/BaseRequest.java

@@ -0,0 +1,55 @@
+/**
+ * 汇付天下有限公司
+ * Copyright (c) 2006-2021 ChinaPnR,Inc.All Rights Reserved.
+ */
+package com.fs.huifuPay.sdk.opps.core.net;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ *
+ * @author kefeng.zheng
+ * @version v 0.1
+ */
+public class BaseRequest {
+    @JSONField(name="data")
+    private String data;
+    @JSONField(name="sign")
+    private String sign;
+    @JSONField(name="sys_id")
+    private String sysId;
+    @JSONField(name="sign_type")
+    private String signType;
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+
+    public String getSysId() {
+        return sysId;
+    }
+
+    public void setSysId(String sysId) {
+        this.sysId = sysId;
+    }
+
+    public String getSignType() {
+        return signType;
+    }
+
+    public void setSignType(String signType) {
+        this.signType = signType;
+    }
+}

+ 54 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/BaseRequest.java

@@ -0,0 +1,54 @@
+package com.fs.huifuPay.sdk.opps.core.request;
+
+import com.fs.huifuPay.sdk.opps.core.enums.FunctionCodeEnum;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Description: 支付基础参数
+ * @Author: lj
+ * @Date 2021/6/22 18:10
+ */
+public abstract class BaseRequest {
+
+    /**
+     * 其他拓展信息
+     */
+    protected Map<String, Object> extendInfos = new HashMap<>();
+
+    public Map<String, Object> getExtendInfos() {
+        return extendInfos;
+    }
+
+    /**
+     * 新增拓展参数
+     *
+     * @return
+     */
+    public void setExtendInfo(Map<String, Object> extendInfos) {
+        this.extendInfos.putAll(extendInfos);
+    }
+
+    /**
+     * 新增拓展参数
+     *
+     * @param key
+     * @param value
+     * @return
+     */
+    public void addExtendInfo(String key, Object value) {
+        this.extendInfos.put(key, value);
+    }
+
+    /**
+     * functionCode对应接口url
+     *
+     * @return
+     */
+    public abstract FunctionCodeEnum getFunctionCode();
+
+    public BaseRequest() {
+    }
+
+}

+ 152 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityAddRequest.java

@@ -0,0 +1,152 @@
+package com.fs.huifuPay.sdk.opps.core.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fs.huifuPay.sdk.opps.core.enums.FunctionCodeEnum;
+
+/**
+ * 商户活动报名
+ *
+ * @author sdk-generator
+ * @Description
+ */
+public class V2MerchantActivityAddRequest extends BaseRequest {
+
+    /**
+     * 请求日期
+     */
+    @JSONField(name = "req_date")
+    private String reqDate;
+    /**
+     * 请求流水号
+     */
+    @JSONField(name = "req_seq_id")
+    private String reqSeqId;
+    /**
+     * 汇付客户Id
+     */
+    @JSONField(name = "huifu_id")
+    private String huifuId;
+    /**
+     * 营业执照图片
+     */
+    @JSONField(name = "bl_photo")
+    private String blPhoto;
+    /**
+     * 店内环境图片
+     */
+    @JSONField(name = "dh_photo")
+    private String dhPhoto;
+    /**
+     * 手续费类型
+     */
+    @JSONField(name = "fee_type")
+    private String feeType;
+    /**
+     * 整体门面图片(门头照)
+     */
+    @JSONField(name = "mm_photo")
+    private String mmPhoto;
+    /**
+     * 收银台照片
+     */
+    @JSONField(name = "syt_photo")
+    private String sytPhoto;
+    /**
+     * 支付通道
+     */
+    @JSONField(name = "pay_way")
+    private String payWay;
+
+    @Override
+    public FunctionCodeEnum getFunctionCode() {
+        return FunctionCodeEnum.V2_MERCHANT_ACTIVITY_ADD;
+    }
+
+    public V2MerchantActivityAddRequest() {
+    }
+
+    public V2MerchantActivityAddRequest(String reqDate, String reqSeqId, String huifuId, String blPhoto, String dhPhoto, String feeType, String mmPhoto, String sytPhoto, String payWay) {
+        this.reqDate = reqDate;
+        this.reqSeqId = reqSeqId;
+        this.huifuId = huifuId;
+        this.blPhoto = blPhoto;
+        this.dhPhoto = dhPhoto;
+        this.feeType = feeType;
+        this.mmPhoto = mmPhoto;
+        this.sytPhoto = sytPhoto;
+        this.payWay = payWay;
+    }
+
+    public String getReqDate() {
+        return reqDate;
+    }
+
+    public void setReqDate(String reqDate) {
+        this.reqDate = reqDate;
+    }
+
+    public String getReqSeqId() {
+        return reqSeqId;
+    }
+
+    public void setReqSeqId(String reqSeqId) {
+        this.reqSeqId = reqSeqId;
+    }
+
+    public String getHuifuId() {
+        return huifuId;
+    }
+
+    public void setHuifuId(String huifuId) {
+        this.huifuId = huifuId;
+    }
+
+    public String getBlPhoto() {
+        return blPhoto;
+    }
+
+    public void setBlPhoto(String blPhoto) {
+        this.blPhoto = blPhoto;
+    }
+
+    public String getDhPhoto() {
+        return dhPhoto;
+    }
+
+    public void setDhPhoto(String dhPhoto) {
+        this.dhPhoto = dhPhoto;
+    }
+
+    public String getFeeType() {
+        return feeType;
+    }
+
+    public void setFeeType(String feeType) {
+        this.feeType = feeType;
+    }
+
+    public String getMmPhoto() {
+        return mmPhoto;
+    }
+
+    public void setMmPhoto(String mmPhoto) {
+        this.mmPhoto = mmPhoto;
+    }
+
+    public String getSytPhoto() {
+        return sytPhoto;
+    }
+
+    public void setSytPhoto(String sytPhoto) {
+        this.sytPhoto = sytPhoto;
+    }
+
+    public String getPayWay() {
+        return payWay;
+    }
+
+    public void setPayWay(String payWay) {
+        this.payWay = payWay;
+    }
+
+}

+ 68 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityQueryRequest.java

@@ -0,0 +1,68 @@
+package com.fs.huifuPay.sdk.opps.core.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fs.huifuPay.sdk.opps.core.enums.FunctionCodeEnum;
+
+/**
+ * 商户活动报名查询
+ *
+ * @author sdk-generator
+ * @Description
+ */
+public class V2MerchantActivityQueryRequest extends BaseRequest {
+
+    /**
+     * 请求流水号
+     */
+    @JSONField(name = "req_seq_id")
+    private String reqSeqId;
+    /**
+     * 请求日期
+     */
+    @JSONField(name = "req_date")
+    private String reqDate;
+    /**
+     * 汇付客户Id
+     */
+    @JSONField(name = "huifu_id")
+    private String huifuId;
+
+    @Override
+    public FunctionCodeEnum getFunctionCode() {
+        return FunctionCodeEnum.V2_MERCHANT_ACTIVITY_QUERY;
+    }
+
+    public V2MerchantActivityQueryRequest() {
+    }
+
+    public V2MerchantActivityQueryRequest(String reqSeqId, String reqDate, String huifuId) {
+        this.reqSeqId = reqSeqId;
+        this.reqDate = reqDate;
+        this.huifuId = huifuId;
+    }
+
+    public String getReqSeqId() {
+        return reqSeqId;
+    }
+
+    public void setReqSeqId(String reqSeqId) {
+        this.reqSeqId = reqSeqId;
+    }
+
+    public String getReqDate() {
+        return reqDate;
+    }
+
+    public void setReqDate(String reqDate) {
+        this.reqDate = reqDate;
+    }
+
+    public String getHuifuId() {
+        return huifuId;
+    }
+
+    public void setHuifuId(String huifuId) {
+        this.huifuId = huifuId;
+    }
+
+}

+ 138 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityUnionpayMerbaseinfoApplyRequest.java

@@ -0,0 +1,138 @@
+package com.fs.huifuPay.sdk.opps.core.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fs.huifuPay.sdk.opps.core.enums.FunctionCodeEnum;
+
+/**
+ * 银联活动商户入驻
+ *
+ * @author sdk-generator
+ * @Description
+ */
+public class V2MerchantActivityUnionpayMerbaseinfoApplyRequest extends BaseRequest {
+
+    /**
+     * 请求流水号
+     */
+    @JSONField(name = "req_seq_id")
+    private String reqSeqId;
+    /**
+     * 请求日期
+     */
+    @JSONField(name = "req_date")
+    private String reqDate;
+    /**
+     * 汇付客户Id
+     */
+    @JSONField(name = "huifu_id")
+    private String huifuId;
+    /**
+     * 商户类型
+     */
+    @JSONField(name = "mer_type")
+    private String merType;
+    /**
+     * 经营类型
+     */
+    @JSONField(name = "deal_type")
+    private String dealType;
+    /**
+     * 所属行业(MCC)MERCHANT_01-自然人 需要传入,参考[银联MCC编码](https://paas.huifu.com/partners/api/#/csfl/api_csfl_ylmccbm) ;&lt;font color&#x3D;&quot;green&quot;&gt;示例值:5311&lt;/font&gt;
+     */
+    @JSONField(name = "mcc")
+    private String mcc;
+    /**
+     * 负责人手机号
+     */
+    @JSONField(name = "legal_mobile")
+    private String legalMobile;
+    /**
+     * 联系人身份证号
+     */
+    @JSONField(name = "contract_id_no")
+    private String contractIdNo;
+
+    @Override
+    public FunctionCodeEnum getFunctionCode() {
+        return FunctionCodeEnum.V2_MERCHANT_ACTIVITY_UNIONPAY_MERBASEINFO_APPLY;
+    }
+
+    public V2MerchantActivityUnionpayMerbaseinfoApplyRequest() {
+    }
+
+    public V2MerchantActivityUnionpayMerbaseinfoApplyRequest(String reqSeqId, String reqDate, String huifuId, String merType, String dealType, String mcc, String legalMobile, String contractIdNo) {
+        this.reqSeqId = reqSeqId;
+        this.reqDate = reqDate;
+        this.huifuId = huifuId;
+        this.merType = merType;
+        this.dealType = dealType;
+        this.mcc = mcc;
+        this.legalMobile = legalMobile;
+        this.contractIdNo = contractIdNo;
+    }
+
+    public String getReqSeqId() {
+        return reqSeqId;
+    }
+
+    public void setReqSeqId(String reqSeqId) {
+        this.reqSeqId = reqSeqId;
+    }
+
+    public String getReqDate() {
+        return reqDate;
+    }
+
+    public void setReqDate(String reqDate) {
+        this.reqDate = reqDate;
+    }
+
+    public String getHuifuId() {
+        return huifuId;
+    }
+
+    public void setHuifuId(String huifuId) {
+        this.huifuId = huifuId;
+    }
+
+    public String getMerType() {
+        return merType;
+    }
+
+    public void setMerType(String merType) {
+        this.merType = merType;
+    }
+
+    public String getDealType() {
+        return dealType;
+    }
+
+    public void setDealType(String dealType) {
+        this.dealType = dealType;
+    }
+
+    public String getMcc() {
+        return mcc;
+    }
+
+    public void setMcc(String mcc) {
+        this.mcc = mcc;
+    }
+
+    public String getLegalMobile() {
+        return legalMobile;
+    }
+
+    public void setLegalMobile(String legalMobile) {
+        this.legalMobile = legalMobile;
+    }
+
+    public String getContractIdNo() {
+        return contractIdNo;
+    }
+
+    public void setContractIdNo(String contractIdNo) {
+        this.contractIdNo = contractIdNo;
+    }
+
+}

+ 82 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityUnionpayMerbaseinfoQueryRequest.java

@@ -0,0 +1,82 @@
+package com.fs.huifuPay.sdk.opps.core.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fs.huifuPay.sdk.opps.core.enums.FunctionCodeEnum;
+
+/**
+ * 银联活动商户信息查询
+ *
+ * @author sdk-generator
+ * @Description
+ */
+public class V2MerchantActivityUnionpayMerbaseinfoQueryRequest extends BaseRequest {
+
+    /**
+     * 请求流水号
+     */
+    @JSONField(name = "req_seq_id")
+    private String reqSeqId;
+    /**
+     * 请求日期
+     */
+    @JSONField(name = "req_date")
+    private String reqDate;
+    /**
+     * 汇付客户Id
+     */
+    @JSONField(name = "huifu_id")
+    private String huifuId;
+    /**
+     * 银联活动商户号
+     */
+    @JSONField(name = "mer_no")
+    private String merNo;
+
+    @Override
+    public FunctionCodeEnum getFunctionCode() {
+        return FunctionCodeEnum.V2_MERCHANT_ACTIVITY_UNIONPAY_MERBASEINFO_QUERY;
+    }
+
+    public V2MerchantActivityUnionpayMerbaseinfoQueryRequest() {
+    }
+
+    public V2MerchantActivityUnionpayMerbaseinfoQueryRequest(String reqSeqId, String reqDate, String huifuId, String merNo) {
+        this.reqSeqId = reqSeqId;
+        this.reqDate = reqDate;
+        this.huifuId = huifuId;
+        this.merNo = merNo;
+    }
+
+    public String getReqSeqId() {
+        return reqSeqId;
+    }
+
+    public void setReqSeqId(String reqSeqId) {
+        this.reqSeqId = reqSeqId;
+    }
+
+    public String getReqDate() {
+        return reqDate;
+    }
+
+    public void setReqDate(String reqDate) {
+        this.reqDate = reqDate;
+    }
+
+    public String getHuifuId() {
+        return huifuId;
+    }
+
+    public void setHuifuId(String huifuId) {
+        this.huifuId = huifuId;
+    }
+
+    public String getMerNo() {
+        return merNo;
+    }
+
+    public void setMerNo(String merNo) {
+        this.merNo = merNo;
+    }
+
+}

+ 54 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityUnionpayQueryRequest.java

@@ -0,0 +1,54 @@
+package com.fs.huifuPay.sdk.opps.core.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fs.huifuPay.sdk.opps.core.enums.FunctionCodeEnum;
+
+/**
+ * 银联活动列表查询
+ *
+ * @author sdk-generator
+ * @Description
+ */
+public class V2MerchantActivityUnionpayQueryRequest extends BaseRequest {
+
+    /**
+     * 请求流水号
+     */
+    @JSONField(name = "req_seq_id")
+    private String reqSeqId;
+    /**
+     * 请求日期
+     */
+    @JSONField(name = "req_date")
+    private String reqDate;
+
+    @Override
+    public FunctionCodeEnum getFunctionCode() {
+        return FunctionCodeEnum.V2_MERCHANT_ACTIVITY_UNIONPAY_QUERY;
+    }
+
+    public V2MerchantActivityUnionpayQueryRequest() {
+    }
+
+    public V2MerchantActivityUnionpayQueryRequest(String reqSeqId, String reqDate) {
+        this.reqSeqId = reqSeqId;
+        this.reqDate = reqDate;
+    }
+
+    public String getReqSeqId() {
+        return reqSeqId;
+    }
+
+    public void setReqSeqId(String reqSeqId) {
+        this.reqSeqId = reqSeqId;
+    }
+
+    public String getReqDate() {
+        return reqDate;
+    }
+
+    public void setReqDate(String reqDate) {
+        this.reqDate = reqDate;
+    }
+
+}

+ 82 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityUnionpayRegisteStatusQueryRequest.java

@@ -0,0 +1,82 @@
+package com.fs.huifuPay.sdk.opps.core.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fs.huifuPay.sdk.opps.core.enums.FunctionCodeEnum;
+
+/**
+ * 银联活动商户入驻状态查询
+ *
+ * @author sdk-generator
+ * @Description
+ */
+public class V2MerchantActivityUnionpayRegisteStatusQueryRequest extends BaseRequest {
+
+    /**
+     * 请求流水号
+     */
+    @JSONField(name = "req_seq_id")
+    private String reqSeqId;
+    /**
+     * 请求日期
+     */
+    @JSONField(name = "req_date")
+    private String reqDate;
+    /**
+     * 汇付客户Id
+     */
+    @JSONField(name = "huifu_id")
+    private String huifuId;
+    /**
+     * 工单号
+     */
+    @JSONField(name = "serial_no")
+    private String serialNo;
+
+    @Override
+    public FunctionCodeEnum getFunctionCode() {
+        return FunctionCodeEnum.V2_MERCHANT_ACTIVITY_UNIONPAY_REGISTE_STATUS_QUERY;
+    }
+
+    public V2MerchantActivityUnionpayRegisteStatusQueryRequest() {
+    }
+
+    public V2MerchantActivityUnionpayRegisteStatusQueryRequest(String reqSeqId, String reqDate, String huifuId, String serialNo) {
+        this.reqSeqId = reqSeqId;
+        this.reqDate = reqDate;
+        this.huifuId = huifuId;
+        this.serialNo = serialNo;
+    }
+
+    public String getReqSeqId() {
+        return reqSeqId;
+    }
+
+    public void setReqSeqId(String reqSeqId) {
+        this.reqSeqId = reqSeqId;
+    }
+
+    public String getReqDate() {
+        return reqDate;
+    }
+
+    public void setReqDate(String reqDate) {
+        this.reqDate = reqDate;
+    }
+
+    public String getHuifuId() {
+        return huifuId;
+    }
+
+    public void setHuifuId(String huifuId) {
+        this.huifuId = huifuId;
+    }
+
+    public String getSerialNo() {
+        return serialNo;
+    }
+
+    public void setSerialNo(String serialNo) {
+        this.serialNo = serialNo;
+    }
+
+}

+ 96 - 0
fs-service-system/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2MerchantActivityUnionpaySignRequest.java

@@ -0,0 +1,96 @@
+package com.fs.huifuPay.sdk.opps.core.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fs.huifuPay.sdk.opps.core.enums.FunctionCodeEnum;
+
+/**
+ * 银联活动报名
+ *
+ * @author sdk-generator
+ * @Description
+ */
+public class V2MerchantActivityUnionpaySignRequest extends BaseRequest {
+
+    /**
+     * 请求流水号
+     */
+    @JSONField(name = "req_seq_id")
+    private String reqSeqId;
+    /**
+     * 请求日期
+     */
+    @JSONField(name = "req_date")
+    private String reqDate;
+    /**
+     * 汇付客户Id
+     */
+    @JSONField(name = "huifu_id")
+    private String huifuId;
+    /**
+     * 活动编号
+     */
+    @JSONField(name = "activity_id")
+    private String activityId;
+    /**
+     * 银联活动商户号
+     */
+    @JSONField(name = "mer_no")
+    private String merNo;
+
+    @Override
+    public FunctionCodeEnum getFunctionCode() {
+        return FunctionCodeEnum.V2_MERCHANT_ACTIVITY_UNIONPAY_SIGN;
+    }
+
+    public V2MerchantActivityUnionpaySignRequest() {
+    }
+
+    public V2MerchantActivityUnionpaySignRequest(String reqSeqId, String reqDate, String huifuId, String activityId, String merNo) {
+        this.reqSeqId = reqSeqId;
+        this.reqDate = reqDate;
+        this.huifuId = huifuId;
+        this.activityId = activityId;
+        this.merNo = merNo;
+    }
+
+    public String getReqSeqId() {
+        return reqSeqId;
+    }
+
+    public void setReqSeqId(String reqSeqId) {
+        this.reqSeqId = reqSeqId;
+    }
+
+    public String getReqDate() {
+        return reqDate;
+    }
+
+    public void setReqDate(String reqDate) {
+        this.reqDate = reqDate;
+    }
+
+    public String getHuifuId() {
+        return huifuId;
+    }
+
+    public void setHuifuId(String huifuId) {
+        this.huifuId = huifuId;
+    }
+
+    public String getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(String activityId) {
+        this.activityId = activityId;
+    }
+
+    public String getMerNo() {
+        return merNo;
+    }
+
+    public void setMerNo(String merNo) {
+        this.merNo = merNo;
+    }
+
+}

Некоторые файлы не были показаны из-за большого количества измененных файлов