1
0

19 Ревизии a21a66c3d6 ... 740acb2f5f

Автор SHA1 Съобщение Дата
  yfh 740acb2f5f Merge remote-tracking branch 'origin/bly_store' into bly_store преди 6 дни
  yfh a590c577ca Merge branch 'master' into bly_store преди 6 дни
  yfh a8d3218c2a 调整中i康问题 преди 6 дни
  zyp d506729b89 zyp 自动发课老商户mp领红包 преди 6 дни
  zyp c39fe68a06 zyp 收款功能接口 преди 1 седмица
  caoliqin 20e7d631c0 fix:营期会员汇总统计bug修复 преди 1 седмица
  wjj 37993134a7 修改推送订单查询 преди 1 седмица
  zyp 507ce5bc5c zyp 收款功能接口 преди 1 седмица
  yfh 2e2389b9ea Merge branch 'bly_store' преди 1 седмица
  yfh 5a0d338965 Merge branch 'bly_store' преди 1 седмица
  yfh 9d153f67d1 Merge branch 'bly_store' преди 1 седмица
  yfh 790612682a Merge remote-tracking branch 'origin/master' преди 1 седмица
  caoliqin 3c233ad1bb feat:从润天移动app的投诉建议功能到hisscrm преди 1 седмица
  三七 990ebe029e 老商户号 发红包 + 公司前缀 преди 1 седмица
  jzp e586763a37 1.提交九州企微通话记录、通话记录统计标签筛选展示 преди 1 седмица
  Long 02c1a22217 fsDoctorApp MybatisConfig配置修改 преди 1 седмица
  wjj ce2d1f9c8a 修改聚水潭推送订单--->备注 根据日期来传1到30 преди 1 седмица
  Long fc2deba1e8 红德堂-ipad地址和ai地址配置修改 преди 1 седмица
  三七 28cded106f 是否药品 fsStoreProductMapper.insertFsStoreProduct(product); преди 1 седмица
променени са 35 файла, в които са добавени 1505 реда и са изтрити 53 реда
  1. 41 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwUserVoiceLogController.java
  2. 7 6
      fs-doctor-app/src/main/java/com/fs/framework/config/MyBatisConfig.java
  3. 11 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  4. 5 1
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java
  5. 42 0
      fs-service/src/main/java/com/fs/his/domain/FsComplaintTemplate.java
  6. 63 0
      fs-service/src/main/java/com/fs/his/domain/FsUserComplaint.java
  7. 62 0
      fs-service/src/main/java/com/fs/his/mapper/FsComplaintTemplateMapper.java
  8. 1 1
      fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java
  9. 63 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserComplaintMapper.java
  10. 62 0
      fs-service/src/main/java/com/fs/his/service/IFsComplaintTemplateService.java
  11. 6 0
      fs-service/src/main/java/com/fs/his/service/IFsStorePaymentService.java
  12. 63 0
      fs-service/src/main/java/com/fs/his/service/IFsUserComplaintService.java
  13. 94 0
      fs-service/src/main/java/com/fs/his/service/impl/FsComplaintTemplateServiceImpl.java
  14. 130 3
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java
  15. 94 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserComplaintServiceImpl.java
  16. 88 0
      fs-service/src/main/java/com/fs/his/utils/ComplaintTreeUtil.java
  17. 16 0
      fs-service/src/main/java/com/fs/his/vo/FsComplaintTemplateVO.java
  18. 52 0
      fs-service/src/main/java/com/fs/his/vo/FsUserComplaintVo.java
  19. 14 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStorePaymentGetWxaCodeParam.java
  20. 5 4
      fs-service/src/main/java/com/fs/hisStore/service/IFsStorePaymentScrmService.java
  21. 139 11
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java
  22. 2 2
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java
  23. 10 0
      fs-service/src/main/java/com/fs/qw/vo/QwUserVoiceLogVo.java
  24. 2 2
      fs-service/src/main/resources/application-config-druid-hdt.yml
  25. 1 1
      fs-service/src/main/resources/application-config-druid-nmgyt.yml
  26. 5 3
      fs-service/src/main/resources/mapper/course/FsCourseTrafficLogMapper.xml
  27. 86 0
      fs-service/src/main/resources/mapper/his/FsComplaintTemplateMapper.xml
  28. 108 0
      fs-service/src/main/resources/mapper/his/FsUserComplaintMapper.xml
  29. 1 1
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  30. 8 1
      fs-service/src/main/resources/mapper/qw/QwUserVoiceLogMapper.xml
  31. 8 0
      fs-user-app/src/main/java/com/fs/app/controller/CompanyUserController.java
  32. 122 0
      fs-user-app/src/main/java/com/fs/app/controller/FsUserComplaintController.java
  33. 62 0
      fs-user-app/src/main/java/com/fs/app/controller/PaymentController.java
  34. 9 0
      fs-user-app/src/main/java/com/fs/app/controller/store/CompanyUserScrmController.java
  35. 23 17
      fs-user-app/src/main/java/com/fs/app/controller/store/PaymentScrmController.java

+ 41 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwUserVoiceLogController.java

@@ -10,14 +10,20 @@ import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.qw.domain.QwUserVoiceLog;
+import com.fs.qw.param.QwTagSearchParam;
+import com.fs.qw.service.IQwTagService;
 import com.fs.qw.service.IQwUserVoiceLogService;
 import com.fs.qw.vo.QwUserVoiceLogTotalVo;
 import com.fs.qw.vo.QwUserVoiceLogVo;
+import com.github.pagehelper.PageHelper;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 企微用户通话记录Controller
@@ -35,6 +41,9 @@ public class QwUserVoiceLogController extends BaseController
     @Autowired
     private TokenService tokenService;
 
+    @Autowired
+    private IQwTagService iQwTagService;
+
     /**
      * 查询企微用户通话记录列表
      */
@@ -49,6 +58,35 @@ public class QwUserVoiceLogController extends BaseController
         return getDataTable(list);
     }
 
+
+    /**
+     * 查询企微用户通话记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwUserVoiceLog:list')")
+    @PostMapping("/newList")
+    public TableDataInfo newList(@RequestBody QwUserVoiceLogVo qwUserVoiceLog)
+    {
+        PageHelper.startPage(qwUserVoiceLog.getPageNum(), qwUserVoiceLog.getPageSize());
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        qwUserVoiceLog.setCompanyId(loginUser.getCompany().getCompanyId());
+        List<QwUserVoiceLogVo> list = qwUserVoiceLogService.selectQwUserVoiceLogList(qwUserVoiceLog);
+        list.forEach(item->{
+
+            if (!Objects.equals(item.getQwExternalContact().getTagIds(), "[]") && item.getQwExternalContact().getTagIds()!=null) {
+                QwTagSearchParam param = new QwTagSearchParam();
+                Gson gson = new Gson();
+                List<String> tagIds = gson.fromJson(
+                        item.getQwExternalContact().getTagIds(),
+                        new TypeToken<List<String>>() {
+                        }.getType()
+                );
+                param.setTagIds(tagIds);
+                item.setTagIdsName(iQwTagService.selectQwTagListByTagIds(param));
+            }
+        });
+        return getDataTable(list);
+    }
+
     /**
      * 查询我的通话记录列表
      * @param qwUserVoiceLog
@@ -141,6 +179,9 @@ public class QwUserVoiceLogController extends BaseController
     @GetMapping("/totalExport")
     public AjaxResult totalExport(QwUserVoiceLogTotalVo qwUserVoiceLog)
     {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        qwUserVoiceLog.setCompanyId(loginUser.getCompany().getCompanyId());
+        qwUserVoiceLog.setQwUserId(1L);
         List<QwUserVoiceLogTotalVo> list = qwUserVoiceLogService.selectQwUserVoiceLogTotalList(qwUserVoiceLog);
         list.forEach(m-> {
             m.setQwUserName(m.getQwUser().getQwUserName());

+ 7 - 6
fs-doctor-app/src/main/java/com/fs/framework/config/MyBatisConfig.java

@@ -1,5 +1,6 @@
 package com.fs.framework.config;
 
+import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
 import com.fs.common.utils.StringUtils;
 import org.apache.ibatis.io.VFS;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -115,18 +116,18 @@ public class MyBatisConfig
     }
 
     @Bean
-    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
+    public SqlSessionFactory sqlSessionFactorys(DataSource dataSource) throws Exception
     {
-        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
-        String mapperLocations = env.getProperty("mybatis.mapperLocations");
-        String configLocation = env.getProperty("mybatis.configLocation");
+        String typeAliasesPackage = env.getProperty("mybatis-plus.typeAliasesPackage");
+        String mapperLocations = env.getProperty("mybatis-plus.mapperLocations");
+        String configLocation = env.getProperty("mybatis-plus.configLocation");
         typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
         VFS.addImplClass(SpringBootVFS.class);
 
-        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
+        final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
         sessionFactory.setDataSource(dataSource);
         sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
-        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
+        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
         sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
         return sessionFactory.getObject();
     }

+ 11 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -1023,9 +1023,13 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             amount = video.getRedPacketMoney();
         }
 
+
+
         // 准备发送红包参数
         WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
         packetParam.setOpenId(user.getMpOpenId());
+
+
         // 来源是小程序切换openId
         if (param.getSource() == 2) {
             //处理多小程序问题
@@ -1042,11 +1046,17 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             //查出公司绑定openid并赋值
 
         }
+
+        //判断服务号配置是否存在
+        if (StringUtils.isNotEmpty(config.getMpAppId())){
+            packetParam.setMpAppId(config.getMpAppId());
+        }
         packetParam.setAmount(amount);
         packetParam.setSource(param.getSource());
         packetParam.setRedPacketMode(config.getRedPacketMode());
         packetParam.setCompanyId(param.getCompanyId());
         packetParam.setAppId(param.getAppId());
+        packetParam.setUser(user);
 
         System.out.println("红包金额"+amount);
         System.out.println("红包商户号"+packetParam);
@@ -1209,6 +1219,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             if (user.getMpOpenId()!=null&&!isNewWxMerchant){
                 packetParam.setOpenId(user.getMpOpenId());
             }else {
+                //修复数据
                 FsUserWx fsUserWx = fsUserWxService.selectByAppIdAndUserId(param.getAppId(),user.getUserId(),1);
                 if (fsUserWx ==null){
                     if (user.getCourseMaOpenId()==null){

+ 5 - 1
fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.erp.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
@@ -35,6 +36,7 @@ import org.springframework.util.CollectionUtils;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -113,7 +115,9 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
             shopOrderDTO.setFreight(fsStoreOrder.getPayDelivery().doubleValue());
         }
         // 备注
-        shopOrderDTO.setRemark(order.getBuyer_memo());
+        //shopOrderDTO.setRemark(order.getBuyer_memo());
+        shopOrderDTO.setRemark(DateUtil.format(new Date(), "dd"));
+
         // 买家留言
         shopOrderDTO.setBuyerMessage(order.getBuyer_memo());
 

+ 42 - 0
fs-service/src/main/java/com/fs/his/domain/FsComplaintTemplate.java

@@ -0,0 +1,42 @@
+package com.fs.his.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 投诉模板对象 fs_complaint_template
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsComplaintTemplate extends BaseEntity{
+
+    @TableId
+    private Long id;
+
+    /** 上级编码 */
+    @Excel(name = "上级编码")
+    private Long parentId;
+
+    /** 同级下排序 */
+    @Excel(name = "同级下排序")
+    private Long sort;
+
+    /** 投诉分类 */
+    @Excel(name = "投诉分类")
+    private String name;
+
+
+    @Excel(name = "投诉分类")
+    private Long isDel;
+
+
+    private String description;
+
+
+}

+ 63 - 0
fs-service/src/main/java/com/fs/his/domain/FsUserComplaint.java

@@ -0,0 +1,63 @@
+package com.fs.his.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 用户投诉对象 fs_user_complaint
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserComplaint extends BaseEntity{
+
+    @TableId
+    private Long id;
+
+    /** 用户id */
+//    @Excel(name = "用户id")
+    private Long userId;
+
+    @Excel(name = "用户")
+    private String userName;
+
+    /** 投诉模板id */
+    @Excel(name = "投诉模板id")
+    private Long templateId;
+
+    /** 详细内容 */
+    @Excel(name = "详细内容")
+    private String content;
+
+    /** 联系方式 */
+    @Excel(name = "联系方式")
+    private String phone;
+
+    /** 图片地址 */
+    @Excel(name = "图片地址")
+    private String urls;
+
+    @Excel(name = "交易截图")
+    private String tradeImage;
+
+    /** 被投诉人信息 */
+    @Excel(name = "被投诉人信息")
+    private String account;
+
+    /** 是否处理 */
+    @Excel(name = "是否处理")
+    private Integer isHandle;
+
+    //投诉时间
+    private Date complaintsTime;
+    private Date complainteTime;
+
+    private String remarks;
+}

+ 62 - 0
fs-service/src/main/java/com/fs/his/mapper/FsComplaintTemplateMapper.java

@@ -0,0 +1,62 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsComplaintTemplate;
+
+import java.util.List;
+
+/**
+ * 投诉模板Mapper接口
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+public interface FsComplaintTemplateMapper extends BaseMapper<FsComplaintTemplate>{
+    /**
+     * 查询投诉模板
+     *
+     * @param id 投诉模板主键
+     * @return 投诉模板
+     */
+    FsComplaintTemplate selectFsComplaintTemplateById(Long id);
+
+    /**
+     * 查询投诉模板列表
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 投诉模板集合
+     */
+    List<FsComplaintTemplate> selectFsComplaintTemplateList(FsComplaintTemplate fsComplaintTemplate);
+
+    /**
+     * 新增投诉模板
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 结果
+     */
+    int insertFsComplaintTemplate(FsComplaintTemplate fsComplaintTemplate);
+
+    /**
+     * 修改投诉模板
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 结果
+     */
+    int updateFsComplaintTemplate(FsComplaintTemplate fsComplaintTemplate);
+
+    /**
+     * 删除投诉模板
+     *
+     * @param id 投诉模板主键
+     * @return 结果
+     */
+    int deleteFsComplaintTemplateById(Long id);
+
+    /**
+     * 批量删除投诉模板
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsComplaintTemplateByIds(Long[] ids);
+}

+ 1 - 1
fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java

@@ -643,7 +643,7 @@ public interface FsStoreOrderMapper
             "</if>" +
             "</script>"})
     Long selectFsStoreOrderTotalCount(@Param("type") int type, @Param("companyId") Long companyId);
-    @Select("select order_id from fs_store_order WHERE `status`= 2 and order_type=1 and store_id in (select store_id from fs_store where delivery_type=2) and  extend_order_id is null ")
+    @Select("select order_id from fs_store_order WHERE `status`= 2 and  extend_order_id is null ")
     List<Long> selectFsStoreOrderNoCreateOms();
     @Select("select order_id from fs_store_order WHERE `status`= 2 and order_type=2 and store_id in(select store_id from fs_store where delivery_type=1) and  extend_order_id is null ")
     List<Long> selectFsStoreOrderNoTuiOrder();

+ 63 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserComplaintMapper.java

@@ -0,0 +1,63 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsUserComplaint;
+import com.fs.his.vo.FsUserComplaintVo;
+
+import java.util.List;
+
+/**
+ * 用户投诉Mapper接口
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+public interface FsUserComplaintMapper extends BaseMapper<FsUserComplaint>{
+    /**
+     * 查询用户投诉
+     *
+     * @param id 用户投诉主键
+     * @return 用户投诉
+     */
+    FsUserComplaintVo selectFsUserComplaintById(Long id);
+
+    /**
+     * 查询用户投诉列表
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 用户投诉集合
+     */
+    List<FsUserComplaintVo> selectFsUserComplaintList(FsUserComplaint fsUserComplaint);
+
+    /**
+     * 新增用户投诉
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 结果
+     */
+    int insertFsUserComplaint(FsUserComplaint fsUserComplaint);
+
+    /**
+     * 修改用户投诉
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 结果
+     */
+    int updateFsUserComplaint(FsUserComplaint fsUserComplaint);
+
+    /**
+     * 删除用户投诉
+     *
+     * @param id 用户投诉主键
+     * @return 结果
+     */
+    int deleteFsUserComplaintById(Long id);
+
+    /**
+     * 批量删除用户投诉
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsUserComplaintByIds(Long[] ids);
+}

+ 62 - 0
fs-service/src/main/java/com/fs/his/service/IFsComplaintTemplateService.java

@@ -0,0 +1,62 @@
+package com.fs.his.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsComplaintTemplate;
+
+import java.util.List;
+
+/**
+ * 投诉模板Service接口
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+public interface IFsComplaintTemplateService extends IService<FsComplaintTemplate>{
+    /**
+     * 查询投诉模板
+     *
+     * @param id 投诉模板主键
+     * @return 投诉模板
+     */
+    FsComplaintTemplate selectFsComplaintTemplateById(Long id);
+
+    /**
+     * 查询投诉模板列表
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 投诉模板集合
+     */
+    List<FsComplaintTemplate> selectFsComplaintTemplateList(FsComplaintTemplate fsComplaintTemplate);
+
+    /**
+     * 新增投诉模板
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 结果
+     */
+    int insertFsComplaintTemplate(FsComplaintTemplate fsComplaintTemplate);
+
+    /**
+     * 修改投诉模板
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 结果
+     */
+    int updateFsComplaintTemplate(FsComplaintTemplate fsComplaintTemplate);
+
+    /**
+     * 批量删除投诉模板
+     *
+     * @param ids 需要删除的投诉模板主键集合
+     * @return 结果
+     */
+    int deleteFsComplaintTemplateByIds(Long[] ids);
+
+    /**
+     * 删除投诉模板信息
+     *
+     * @param id 投诉模板主键
+     * @return 结果
+     */
+    int deleteFsComplaintTemplateById(Long id);
+}

+ 6 - 0
fs-service/src/main/java/com/fs/his/service/IFsStorePaymentService.java

@@ -13,6 +13,8 @@ import com.fs.his.param.PayOrderParam;
 import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.his.vo.FsStorePaymentExcelVO;
 import com.fs.his.vo.FsStorePaymentVO;
+import com.fs.hisStore.param.FsStorePaymentGetWxaCodeParam;
+import com.fs.hisStore.param.FsStorePaymentPayParam;
 import me.chanjar.weixin.common.error.WxErrorException;
 
 import javax.servlet.http.HttpServletRequest;
@@ -114,4 +116,8 @@ public interface IFsStorePaymentService
      * @return R
      */
     R processPayment(PayOrderParam payOrderParam);
+
+    R paymentByWxaCode(FsStorePaymentPayParam payment);
+
+    R getWxaCodeByPayment(FsStorePaymentGetWxaCodeParam param);
 }

+ 63 - 0
fs-service/src/main/java/com/fs/his/service/IFsUserComplaintService.java

@@ -0,0 +1,63 @@
+package com.fs.his.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsUserComplaint;
+import com.fs.his.vo.FsUserComplaintVo;
+
+import java.util.List;
+
+/**
+ * 用户投诉Service接口
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+public interface IFsUserComplaintService extends IService<FsUserComplaint>{
+    /**
+     * 查询用户投诉
+     *
+     * @param id 用户投诉主键
+     * @return 用户投诉
+     */
+    FsUserComplaintVo selectFsUserComplaintById(Long id);
+
+    /**
+     * 查询用户投诉列表
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 用户投诉集合
+     */
+    List<FsUserComplaintVo> selectFsUserComplaintList(FsUserComplaint fsUserComplaint);
+
+    /**
+     * 新增用户投诉
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 结果
+     */
+    int insertFsUserComplaint(FsUserComplaint fsUserComplaint);
+
+    /**
+     * 修改用户投诉
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 结果
+     */
+    int updateFsUserComplaint(FsUserComplaint fsUserComplaint);
+
+    /**
+     * 批量删除用户投诉
+     *
+     * @param ids 需要删除的用户投诉主键集合
+     * @return 结果
+     */
+    int deleteFsUserComplaintByIds(Long[] ids);
+
+    /**
+     * 删除用户投诉信息
+     *
+     * @param id 用户投诉主键
+     * @return 结果
+     */
+    int deleteFsUserComplaintById(Long id);
+}

+ 94 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsComplaintTemplateServiceImpl.java

@@ -0,0 +1,94 @@
+package com.fs.his.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.DateUtils;
+import com.fs.his.domain.FsComplaintTemplate;
+import com.fs.his.mapper.FsComplaintTemplateMapper;
+import com.fs.his.service.IFsComplaintTemplateService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 投诉模板Service业务层处理
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+@Service
+public class FsComplaintTemplateServiceImpl extends ServiceImpl<FsComplaintTemplateMapper, FsComplaintTemplate> implements IFsComplaintTemplateService {
+
+    /**
+     * 查询投诉模板
+     *
+     * @param id 投诉模板主键
+     * @return 投诉模板
+     */
+    @Override
+    public FsComplaintTemplate selectFsComplaintTemplateById(Long id)
+    {
+        return baseMapper.selectFsComplaintTemplateById(id);
+    }
+
+    /**
+     * 查询投诉模板列表
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 投诉模板
+     */
+    @Override
+    public List<FsComplaintTemplate> selectFsComplaintTemplateList(FsComplaintTemplate fsComplaintTemplate)
+    {
+        return baseMapper.selectFsComplaintTemplateList(fsComplaintTemplate);
+    }
+
+    /**
+     * 新增投诉模板
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 结果
+     */
+    @Override
+    public int insertFsComplaintTemplate(FsComplaintTemplate fsComplaintTemplate)
+    {
+        fsComplaintTemplate.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsComplaintTemplate(fsComplaintTemplate);
+    }
+
+    /**
+     * 修改投诉模板
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 结果
+     */
+    @Override
+    public int updateFsComplaintTemplate(FsComplaintTemplate fsComplaintTemplate)
+    {
+        fsComplaintTemplate.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsComplaintTemplate(fsComplaintTemplate);
+    }
+
+    /**
+     * 批量删除投诉模板
+     *
+     * @param ids 需要删除的投诉模板主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsComplaintTemplateByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsComplaintTemplateByIds(ids);
+    }
+
+    /**
+     * 删除投诉模板信息
+     *
+     * @param id 投诉模板主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsComplaintTemplateById(Long id)
+    {
+        return baseMapper.deleteFsComplaintTemplateById(id);
+    }
+}

+ 130 - 3
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -5,9 +5,11 @@ import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.annotation.DataScope;
@@ -20,9 +22,15 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyConfigMapper;
 import com.fs.company.param.FsStoreStatisticsParam;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.ICompanyUserService;
 import com.fs.company.vo.FsStorePaymentStatisticsVO;
+import com.fs.config.cloud.CloudHostProper;
+import com.fs.core.config.WxMaConfiguration;
 import com.fs.core.config.WxPayProperties;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.course.config.CourseConfig;
@@ -47,9 +55,12 @@ import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.his.service.IFsInquiryOrderService;
 import com.fs.his.service.IFsPackageOrderService;
 import com.fs.his.service.IFsStoreOrderService;
+import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.utils.PhoneUtil;
 import com.fs.his.vo.FsStorePaymentExcelVO;
 import com.fs.his.vo.FsStorePaymentVO;
+import com.fs.hisStore.param.FsStorePaymentGetWxaCodeParam;
+import com.fs.hisStore.param.FsStorePaymentPayParam;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuiFuQueryOrderResult;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
@@ -59,6 +70,8 @@ import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
+import com.fs.system.oss.CloudStorageService;
+import com.fs.system.oss.OSSFactory;
 import com.fs.system.service.ISysConfigService;
 import com.fs.tzBankPay.TzBankService.TzBankService;
 import com.fs.tzBankPay.TzBankService.TzBankServiceImpl.TzBankServiceImpl;
@@ -102,7 +115,6 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
-import com.fs.his.service.IFsStorePaymentService;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletRequest;
@@ -152,6 +164,13 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
     private FsUserMapper userMapper;
     @Autowired
     private FsUserWxMapper userWxMapper;
+    @Autowired
+    private ICompanyUserService companyUserService;
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private CloudHostProper cloudHostProper;
 
     /**
      * 查询支付明细
@@ -571,7 +590,7 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         if(StringUtils.isEmpty(code)){
             return R.error("红包单号生成失败,请重试");
         }
-        request.setOutBatchNo("fsCourse" + code);
+        request.setOutBatchNo("fsCourse"+cloudHostProper.getProjectCode() + code);
         request.setBatchRemark("课堂答题奖励");
         request.setBatchName("课堂答题奖励");
         Integer amount = WxPayUnifiedOrderRequest.yuanToFen(param.getAmount().toString());
@@ -583,7 +602,7 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         TransferBatchesRequest.TransferDetail transferDetail = new TransferBatchesRequest.TransferDetail();
         transferDetail.setOpenid(param.getOpenId());
         String code1 = IdUtil.getSnowflake(0, 0).nextIdStr();
-        transferDetail.setOutDetailNo("fsCourse" + code1);
+        transferDetail.setOutDetailNo("fsCourse"+cloudHostProper.getProjectCode() + code1);
         transferDetail.setTransferAmount(amount);
         transferDetail.setTransferRemark("恭喜同学,认真听课,奖励你一朵小红花!");
         transferDetailList.add(transferDetail);
@@ -1152,4 +1171,112 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         return storePayment;
     }
 
+
+    @Override
+    public R getWxaCodeByPayment(FsStorePaymentGetWxaCodeParam param)  {
+        final WxMaService wxMaService = WxMaConfiguration.getMaService(param.getAppId());
+        String scene;
+        //判断销售id
+        if (param.getCompanyUserId() == null){
+            scene = "companyId="+ param.getCompanyId();
+        }else {
+            scene = "companyId="+ param.getCompanyId()+"&"+"companyUserId="+ param.getCompanyUserId();
+        }
+        byte[] file;
+        try {
+            file = wxMaService.getQrcodeService().createWxaCodeUnlimitBytes(
+                    scene,
+                    "pages_user/user/pay",
+                    true,
+                    "release",
+                    430,
+                    true,
+                    null,
+                    false);
+
+            // 上传图片到存储桶
+            String suffix = ".png";
+            CloudStorageService storage = OSSFactory.build();
+            String url;
+            try {
+                url = storage.uploadSuffix(file, suffix);
+            }  catch (Exception e) {
+                // 记录错误日志
+                logger.error("生成图片失败:{}",e.getMessage(),e);
+                return R.error("生成图片失败");
+            }
+            // 返回成功信息
+            return R.ok().put("url",url);
+
+        } catch (WxErrorException e) {
+            logger.error(e.getMessage(), e);
+            return R.error("微信接口调用失败: " + e.getMessage());
+        }
+    }
+
+
+
+    @Override
+    public R paymentByWxaCode(FsStorePaymentPayParam param) {
+        FsUser user = userMapper.selectFsUserById(param.getUserId());
+        if (user==null){
+            return R.error("用户不存在!");
+        }
+        Company company = companyService.selectCompanyById(param.getCompanyId());
+        if (company==null || company.getStatus()==0){
+            return R.error("服务商不存在,或已被停用!");
+        }
+        if(param.getPayMoney().compareTo(new BigDecimal(0.0))<1){
+            return R.error("支付金额必须大于0");
+        }
+        if (param.getCompanyUserId()!=null){
+            CompanyUser companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());
+            if(companyUser == null || companyUser.getStatus().equals("1")){
+                return R.error("注册失败客服已停用,或不存在!");
+            }
+        }
+
+
+        //生成支付流水
+        String orderSn = IdUtil.getSnowflake(0, 0).nextIdStr();
+        FsStorePayment storePayment=new FsStorePayment();
+        storePayment.setCompanyId(param.getCompanyId());
+        //判断销售是否存在
+        if (param.getCompanyUserId()!=null){
+            storePayment.setCompanyUserId(param.getCompanyUserId());
+        }
+        storePayment.setStatus(0);
+        storePayment.setPayCode(orderSn);
+        storePayment.setPayMoney(param.getPayMoney());
+        storePayment.setCreateTime(new Date());
+        storePayment.setPayTypeCode("weixin");
+        storePayment.setBusinessType(1);
+        storePayment.setRemark("商城收款订单支付");
+        storePayment.setOpenId(user.getMaOpenId());
+        storePayment.setUserId(user.getUserId());
+        fsStorePaymentMapper.insertFsStorePayment(storePayment);
+
+        //汇付支付
+        HuiFuCreateOrder o = new HuiFuCreateOrder();
+        o.setTradeType("T_MINIAPP");
+        o.setOpenid(user.getMaOpenId());
+        o.setReqSeqId("payment-"+storePayment.getPayCode());
+        o.setTransAmt(storePayment.getPayMoney().toString());
+        o.setGoodsDesc("商城订单支付");
+        HuifuCreateOrderResult result = huiFuService.createOrder(o);
+        if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+            FsStorePayment mt=new FsStorePayment();
+            mt.setPaymentId(storePayment.getPaymentId());
+            mt.setTradeNo(result.getHf_seq_id());
+            fsStorePaymentMapper.updateFsStorePayment(mt);
+            Map<String, Object> resultMap = com.alibaba.fastjson.JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+            String s = (String) resultMap.get("package");
+            resultMap.put("packageValue",s);
+            return R.ok().put("result",resultMap);
+        }
+        else{
+            return R.error(result.getResp_desc());
+        }
+    }
+
 }

+ 94 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserComplaintServiceImpl.java

@@ -0,0 +1,94 @@
+package com.fs.his.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.DateUtils;
+import com.fs.his.domain.FsUserComplaint;
+import com.fs.his.mapper.FsUserComplaintMapper;
+import com.fs.his.service.IFsUserComplaintService;
+import com.fs.his.vo.FsUserComplaintVo;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 用户投诉Service业务层处理
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+@Service
+public class FsUserComplaintServiceImpl extends ServiceImpl<FsUserComplaintMapper, FsUserComplaint> implements IFsUserComplaintService {
+
+    /**
+     * 查询用户投诉
+     *
+     * @param id 用户投诉主键
+     * @return 用户投诉
+     */
+    @Override
+    public FsUserComplaintVo selectFsUserComplaintById(Long id)
+    {
+        return baseMapper.selectFsUserComplaintById(id);
+    }
+
+    /**
+     * 查询用户投诉列表
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 用户投诉
+     */
+    @Override
+    public List<FsUserComplaintVo> selectFsUserComplaintList(FsUserComplaint fsUserComplaint)
+    {
+        return baseMapper.selectFsUserComplaintList(fsUserComplaint);
+    }
+
+    /**
+     * 新增用户投诉
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 结果
+     */
+    @Override
+    public int insertFsUserComplaint(FsUserComplaint fsUserComplaint)
+    {
+        fsUserComplaint.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsUserComplaint(fsUserComplaint);
+    }
+
+    /**
+     * 修改用户投诉
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 结果
+     */
+    @Override
+    public int updateFsUserComplaint(FsUserComplaint fsUserComplaint)
+    {
+        return baseMapper.updateFsUserComplaint(fsUserComplaint);
+    }
+
+    /**
+     * 批量删除用户投诉
+     *
+     * @param ids 需要删除的用户投诉主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserComplaintByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsUserComplaintByIds(ids);
+    }
+
+    /**
+     * 删除用户投诉信息
+     *
+     * @param id 用户投诉主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserComplaintById(Long id)
+    {
+        return baseMapper.deleteFsUserComplaintById(id);
+    }
+}

+ 88 - 0
fs-service/src/main/java/com/fs/his/utils/ComplaintTreeUtil.java

@@ -0,0 +1,88 @@
+package com.fs.his.utils;
+
+import com.fs.his.vo.FsComplaintTemplateVO;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName 树形工具类
+ **/
+public class ComplaintTreeUtil {
+    /**
+     * 获得指定节点下所有归档
+     *
+     * @param list
+     * @param parentId
+     * @return
+     */
+    public static List<FsComplaintTemplateVO> list2TreeConverter(List<FsComplaintTemplateVO> list, int parentId) {
+        List<FsComplaintTemplateVO> returnList = new ArrayList<>();
+
+        for (FsComplaintTemplateVO res : list) {
+            //判断对象是否为根节点
+
+            if (res.getParentId() == parentId) {
+                //该节点为根节点,开始递归
+                //通过递归为节点设置childList
+                recursionFn(list, res);
+                returnList.add(res);
+            }
+        }
+
+        return returnList;
+    }
+
+    /**
+     * 递归列表
+     * 通过递归,给指定t节点设置childList
+     *
+     * @param list
+     * @param t
+     */
+    public static void recursionFn(List<FsComplaintTemplateVO> list, FsComplaintTemplateVO t) {
+        //只能获取当前t节点的子节点集,并不是所有子节点集
+        List<FsComplaintTemplateVO> childsList = getChildList(list, t);
+
+        if(childsList!=null&&childsList.size()>0){
+            //设置他的子集对象集
+            t.setChildren(childsList);
+        }
+
+
+
+        //迭代子集对象集
+
+        //遍历完,则退出递归
+        for (FsComplaintTemplateVO nextChild : childsList) {
+
+            //判断子集对象是否还有子节点
+            if (!CollectionUtils.isEmpty(childsList)) {
+                //有下一个子节点,继续递归
+                recursionFn(list, nextChild);
+            }
+        }
+    }
+
+    /**
+     * 获得指定节点下的所有子节点
+     *
+     * @param list
+     * @param t
+     * @return
+     */
+    public static List<FsComplaintTemplateVO> getChildList(List<FsComplaintTemplateVO> list, FsComplaintTemplateVO t) {
+        List<FsComplaintTemplateVO> childsList = new ArrayList<>();
+        //遍历集合元素,如果元素的Parentid==指定元素的id,则说明是该元素的子节点
+        for (FsComplaintTemplateVO t1 : list) {
+            if (t1.getParentId().equals(t.getId())) {
+                childsList.add(t1);
+            }
+        }
+
+        return childsList;
+    }
+
+
+}

+ 16 - 0
fs-service/src/main/java/com/fs/his/vo/FsComplaintTemplateVO.java

@@ -0,0 +1,16 @@
+package com.fs.his.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FsComplaintTemplateVO {
+    private static final long serialVersionUID = 1L;
+    private Long id;
+    private String name;
+    private Long parentId;
+    private String description;
+    private Long sort;
+    private List<FsComplaintTemplateVO> children; //子集
+}

+ 52 - 0
fs-service/src/main/java/com/fs/his/vo/FsUserComplaintVo.java

@@ -0,0 +1,52 @@
+package com.fs.his.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class FsUserComplaintVo {
+    private Long id;
+
+    /** 用户id */
+    @Excel(name = "用户")
+    private String userName;
+
+    /** 投诉模板id */
+    @Excel(name = "投诉模板id")
+    private Long templateId;
+
+    private String name;
+
+    /** 详细内容 */
+    @Excel(name = "详细内容")
+    private String content;
+
+    /** 联系方式 */
+//   2025-7-3 新增需求不在导出 @Excel(name = "联系方式")
+    private String phone;
+
+    /** 图片地址 */
+    @Excel(name = "图片地址")
+    private String urls;
+
+    @Excel(name = "交易截图")
+    private String tradeImage;
+
+    /** 被投诉人信息 */
+    @Excel(name = "被投诉人信息")
+    private String account;
+
+    /** 是否处理 */
+    @Excel(name = "是否处理")
+    private Integer isHandle;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "投诉时间",dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @Excel(name="备注")
+    private String remarks;
+}

+ 14 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStorePaymentGetWxaCodeParam.java

@@ -0,0 +1,14 @@
+package com.fs.hisStore.param;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class FsStorePaymentGetWxaCodeParam {
+    private Long companyId;
+
+    private Long companyUserId;
+
+    private String appId;
+}

+ 5 - 4
fs-service/src/main/java/com/fs/hisStore/service/IFsStorePaymentScrmService.java

@@ -6,10 +6,7 @@ import java.util.Map;
 import com.alibaba.fastjson.JSONObject;
 import com.fs.common.core.domain.R;
 import com.fs.hisStore.domain.FsStorePaymentScrm;
-import com.fs.hisStore.param.FsStorePaymentPayParam;
-import com.fs.hisStore.param.FsStorePaymentParam;
-import com.fs.hisStore.param.FsStoreStatisticsParam;
-import com.fs.hisStore.param.WxSendRedPacketParam;
+import com.fs.hisStore.param.*;
 import com.fs.hisStore.vo.FsStorePaymentStatisticsVO;
 import com.fs.hisStore.vo.FsStorePaymentVO;
 
@@ -115,4 +112,8 @@ public interface IFsStorePaymentScrmService
     void bufaRedPacket();
 
     R sendRewardByTest(Long userId);
+
+    R getWxaCodeByPayment(FsStorePaymentGetWxaCodeParam param);
+
+    R paymentByWxaCode(FsStorePaymentPayParam param);
 }

+ 139 - 11
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java

@@ -1,21 +1,25 @@
 package com.fs.hisStore.service.impl;
 
+
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+
+import java.util.*;
+
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
 import com.fs.common.annotation.DataScope;
 import com.fs.common.config.FSSysConfig;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyConfigMapper;
 import com.fs.company.service.ICompanyService;
@@ -26,20 +30,26 @@ import com.fs.course.config.RedPacketConfig;
 import com.fs.course.domain.FsCourseRedPacketLog;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
 import com.fs.course.service.IFsCourseRedPacketLogService;
+import com.fs.his.config.FsSysConfig;
+import com.fs.his.domain.FsUser;
 import com.fs.his.domain.FsUserWx;
+import com.fs.his.service.IFsUserService;
 import com.fs.his.service.IFsUserWxService;
 import com.fs.his.utils.ConfigUtil;
+import com.fs.his.utils.HttpUtil;
 import com.fs.hisStore.enums.SysConfigEnum;
+import com.fs.hisStore.param.*;
+import com.fs.huifuPay.domain.HuiFuCreateOrder;
+import com.fs.huifuPay.domain.HuifuCreateOrderResult;
+import com.fs.huifuPay.service.HuiFuService;
 import com.fs.pay.pay.config.PayConfig;
 import com.fs.pay.pay.dto.WxJspayDTO;
-import com.fs.hisStore.param.FsStoreStatisticsParam;
-import com.fs.hisStore.param.WxSendRedPacketParam;
 import com.fs.hisStore.vo.FsStorePaymentStatisticsVO;
+import com.fs.system.oss.CloudStorageService;
+import com.fs.system.oss.OSSFactory;
 import com.fs.system.service.ISysConfigService;
 import com.fs.wx.miniapp.config.WxMaProperties;
 import com.fs.hisStore.domain.FsUserScrm;
-import com.fs.hisStore.param.FsStorePaymentPayParam;
-import com.fs.hisStore.param.FsStorePaymentParam;
 import com.fs.hisStore.service.IFsUserScrmService;
 import com.fs.hisStore.vo.FsStorePaymentVO;
 import com.fs.pay.service.IPayService;
@@ -54,6 +64,8 @@ import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.TransferService;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
+import com.google.common.reflect.TypeToken;
+import com.google.gson.Gson;
 import me.chanjar.weixin.common.error.WxErrorException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -104,6 +116,13 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
 
     @Autowired
     private CompanyConfigMapper companyConfigMapper;
+
+    @Autowired
+    private HuiFuService huiFuService;
+
+    @Autowired
+    private RedisCache redisCache;
+
     /**
      * 查询支付明细
      *
@@ -322,9 +341,9 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
         storePayment.setBankTransactionId(bankTransactionId);
         fsStorePaymentMapper.updateFsStorePayment(storePayment);
         //增加佣金
-        if(storePayment.getCompanyId()!=null&&storePayment.getCompanyId()>0){
-            companyService.addCompanyPaymentMoney(storePayment);
-        }
+//        if(storePayment.getCompanyId()!=null&&storePayment.getCompanyId()>0){
+//            companyService.addCompanyPaymentMoney(storePayment);
+//        }
         return "SUCCESS";
     }
 
@@ -768,4 +787,113 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
         }
         return R.ok();
         }
+
+
+    @Override
+    public R getWxaCodeByPayment(FsStorePaymentGetWxaCodeParam param)  {
+        final WxMaService wxMaService = WxMaConfiguration.getMaService(param.getAppId());
+        String scene;
+        //判断销售id
+        if (param.getCompanyUserId() == null){
+            scene = "companyId="+ param.getCompanyId();
+        }else {
+            scene = "companyId="+ param.getCompanyId()+"&"+"companyUserId="+ param.getCompanyUserId();
+        }
+        byte[] file;
+        try {
+            file = wxMaService.getQrcodeService().createWxaCodeBytes(
+                    "pages_user/user/pay?companyId="+param.getCompanyId(),
+                    "release",
+                    430,
+                    true,
+                    null,
+                    true);
+
+            // 上传图片到存储桶
+            String suffix = ".png";
+            CloudStorageService storage = OSSFactory.build();
+            String url;
+            try {
+                url = storage.uploadSuffix(file, suffix);
+            }  catch (Exception e) {
+                // 记录错误日志
+                logger.error("生成图片失败:{}",e.getMessage(),e);
+                return R.error("生成图片失败");
+            }
+            redisCache.setCacheObject("company-wxa-code:"+param.getCompanyId(),url);
+            // 返回成功信息
+            return R.ok().put("url",url);
+
+        } catch (WxErrorException e) {
+            logger.error(e.getMessage(), e);
+            return R.error("微信接口调用失败: " + e.getMessage());
+        }
+    }
+
+
+    @Autowired
+    private IFsUserService fsUserService;
+
+    @Override
+    public R paymentByWxaCode(FsStorePaymentPayParam param) {
+        FsUser user = fsUserService.selectFsUserById(param.getUserId());
+        if (user==null){
+            return R.error("用户不存在!");
+        }
+        Company company = companyService.selectCompanyById(param.getCompanyId());
+        if (company==null || company.getStatus()==0){
+            return R.error("服务商不存在,或已被停用!");
+        }
+        if(param.getPayMoney().compareTo(new BigDecimal(0.0))<1){
+            return R.error("支付金额必须大于0");
+        }
+        if (param.getCompanyUserId()!=null){
+            CompanyUser companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());
+            if(companyUser == null || companyUser.getStatus().equals("1")){
+                return R.error("注册失败客服已停用,或不存在!");
+            }
+        }
+
+
+        //生成支付流水
+        String orderSn = IdUtil.getSnowflake(0, 0).nextIdStr();
+        FsStorePaymentScrm storePayment=new FsStorePaymentScrm();
+        storePayment.setCompanyId(param.getCompanyId());
+        //判断销售是否存在
+        if (param.getCompanyUserId()!=null){
+            storePayment.setCompanyUserId(param.getCompanyUserId());
+        }
+        storePayment.setStatus(0);
+        storePayment.setPayCode(orderSn);
+        storePayment.setPayMoney(param.getPayMoney());
+        storePayment.setCreateTime(new Date());
+        storePayment.setPayTypeCode("weixin");
+        storePayment.setBusinessType(1);
+        storePayment.setRemark("商城收款订单支付");
+        storePayment.setOpenId(user.getMaOpenId());
+        storePayment.setUserId(user.getUserId());
+        fsStorePaymentMapper.insertFsStorePayment(storePayment);
+
+        //汇付支付
+        HuiFuCreateOrder o = new HuiFuCreateOrder();
+        o.setTradeType("T_MINIAPP");
+        o.setOpenid(user.getMaOpenId());
+        o.setReqSeqId("payment-"+storePayment.getPayCode());
+        o.setTransAmt(storePayment.getPayMoney().toString());
+        o.setGoodsDesc("商城订单支付");
+        HuifuCreateOrderResult result = huiFuService.createOrder(o);
+        if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+            FsStorePaymentScrm mt=new FsStorePaymentScrm();
+            mt.setPaymentId(storePayment.getPaymentId());
+            mt.setTradeNo(result.getHf_seq_id());
+            fsStorePaymentMapper.updateFsStorePayment(mt);
+            Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+            String s = (String) resultMap.get("package");
+            resultMap.put("packageValue",s);
+            return R.ok().put("result",resultMap);
+        }
+        else{
+            return R.error(result.getResp_desc());
+        }
+    }
 }

+ 2 - 2
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java

@@ -311,7 +311,7 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
             product.setStock(Long.parseLong(countDto.getStock().toString()));
             product.setCompanyIds(param.getCompanyIds());
             product.setVideo(param.getVideo());
-//            product.setIsDrug(param.getIsDrug());
+            product.setIsDrug(param.getIsDrug());
             fsStoreProductMapper.updateFsStoreProduct(product);
             if (param.getSpecType().equals(0)) {
                 ProductArrtDTO fromatDetailDto = ProductArrtDTO.builder()
@@ -336,7 +336,7 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
             product.setStock(Long.parseLong(countDto.getStock().toString()));
             product.setCompanyIds(param.getCompanyIds());
             product.setVideo(param.getVideo());
-//            product.setIsDrug(param.getIsDrug());
+            product.setIsDrug(param.getIsDrug());
             fsStoreProductMapper.insertFsStoreProduct(product);
             if (param.getSpecType().equals(0)) {
                 ProductArrtDTO fromatDetailDto = ProductArrtDTO.builder()

+ 10 - 0
fs-service/src/main/java/com/fs/qw/vo/QwUserVoiceLogVo.java

@@ -9,6 +9,8 @@ import com.fs.qw.domain.QwUser;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
+
 @Data
 @EqualsAndHashCode(callSuper = true)
 public class QwUserVoiceLogVo extends BaseEntity {
@@ -68,4 +70,12 @@ public class QwUserVoiceLogVo extends BaseEntity {
 
     private QwUser qwUser;
 
+    private List<String> tagIds;
+
+    private List<String> tagIdsName;
+
+    private Integer pageNum;
+
+    private Integer pageSize;
+
 }

+ 2 - 2
fs-service/src/main/resources/application-config-druid-hdt.yml

@@ -83,8 +83,8 @@ cloud_host:
 headerImg:
   imgUrl: https://jz-cos-1356808054.cos.ap-chengdu.myqcloud.com/fs/20250515/0877754b59814ea8a428fa3697b20e68.png
 ipad:
-  ipadUrl: http://ipad.cdwjyyh.com
-  aiApi:
+  ipadUrl: http://ipad.hebeihdt.com
+  aiApi: http://127.0.0.1:3000/api
 wx_miniapp_temp:
   pay_order_temp_id:
   inquiry_temp_id:

+ 1 - 1
fs-service/src/main/resources/application-config-druid-nmgyt.yml

@@ -63,7 +63,7 @@ watch:
   password3: v9xsKuqn_$d2y
 
 fs :
-  commonApi: http://172.16.0.9:7771
+  commonApi: http://172.16.0.9:8010
   h5CommonApi: http://192.168.0.18:7771
 nuonuo:
   key: 10924508

+ 5 - 3
fs-service/src/main/resources/mapper/course/FsCourseTrafficLogMapper.xml

@@ -256,10 +256,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 and project = ${project}
             </if>
             <if test="common == null">
-                AND company_id IS NULL
+                AND company_id IS not NULL
             </if>
             <if test="common != null ">
-                AND company_id IS NOT NULL
+                AND company_id IS NULL
             </if>
         </where>
 
@@ -275,7 +275,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="tabType!=null and tabType=='company'">
             group by company_id,`month`
         </if>
-
+        <if test="tabType!=null and tabType=='common'">
+            group by course_id,`month`
+        </if>
     </select>
 
 </mapper>

+ 86 - 0
fs-service/src/main/resources/mapper/his/FsComplaintTemplateMapper.xml

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.his.mapper.FsComplaintTemplateMapper">
+
+    <resultMap type="FsComplaintTemplate" id="FsComplaintTemplateResult">
+        <result property="id"    column="id"    />
+        <result property="parentId"    column="parent_id"    />
+        <result property="sort"    column="sort"    />
+        <result property="name"    column="name"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="isDel"    column="is_del"    />
+        <result property="description"    column="description"    />
+    </resultMap>
+
+    <sql id="selectFsComplaintTemplateVo">
+        select id, parent_id, sort, name, update_time, create_time, is_del,description from fs_complaint_template
+    </sql>
+
+    <select id="selectFsComplaintTemplateList" parameterType="FsComplaintTemplate" resultMap="FsComplaintTemplateResult">
+        <include refid="selectFsComplaintTemplateVo"/>
+        <where>
+            <if test="parentId != null "> and parent_id = #{parentId}</if>
+            <if test="sort != null "> and sort = #{sort}</if>
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="isDel != null "> and is_del = #{isDel}</if>
+            <if test="description != null and description !=''"> and description = #{description}</if>
+        </where>
+    </select>
+
+    <select id="selectFsComplaintTemplateById" parameterType="Long" resultMap="FsComplaintTemplateResult">
+        <include refid="selectFsComplaintTemplateVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertFsComplaintTemplate" parameterType="FsComplaintTemplate">
+        insert into fs_complaint_template
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="parentId != null">parent_id,</if>
+            <if test="sort != null">sort,</if>
+            <if test="name != null and name != ''">name,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="isDel != null">is_del,</if>
+            <if test="description != null">description,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="parentId != null">#{parentId},</if>
+            <if test="sort != null">#{sort},</if>
+            <if test="name != null and name != ''">#{name},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="isDel != null">#{isDel},</if>
+            <if test="description != null">#{description},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsComplaintTemplate" parameterType="FsComplaintTemplate">
+        update fs_complaint_template
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="parentId != null">parent_id = #{parentId},</if>
+            <if test="sort != null">sort = #{sort},</if>
+            <if test="name != null and name != ''">name = #{name},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="isDel != null">is_del = #{isDel},</if>
+            <if test="description != null  and description != ''">description = #{description},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFsComplaintTemplateById" parameterType="Long">
+        delete from fs_complaint_template where id = #{id}
+    </delete>
+
+    <delete id="deleteFsComplaintTemplateByIds" parameterType="String">
+        delete from fs_complaint_template where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 108 - 0
fs-service/src/main/resources/mapper/his/FsUserComplaintMapper.xml

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.his.mapper.FsUserComplaintMapper">
+
+    <resultMap type="FsUserComplaint" id="FsUserComplaintResult">
+        <result property="id"    column="id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="userName"    column="user_name"    />
+        <result property="templateId"    column="template_id"    />
+        <result property="content"    column="content"    />
+        <result property="phone"    column="phone"    />
+        <result property="urls"    column="urls"    />
+        <result property="tradeImage"    column="trade_image"    />
+        <result property="account"    column="account"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="isHandle"    column="is_handle"    />
+    </resultMap>
+
+    <sql id="selectFsUserComplaintVo">
+        select id, user_id,user_name template_id, content, phone, urls,trade_image, account, create_time, is_handle, remarks from fs_user_complaint
+    </sql>
+
+    <select id="selectFsUserComplaintList" parameterType="FsUserComplaint" resultType="com.fs.his.vo.FsUserComplaintVo">
+        select id, user_name, template_id, content, phone, urls,trade_image, account, create_time, is_handle, remarks
+        from fs_user_complaint c
+        <where>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="userName != null and userName != ''"> and user_name like concat('%',#{userName},'%') </if>
+            <if test="templateId != null "> and template_id = #{templateId}</if>
+            <if test="content != null  and content != ''"> and content = #{content}</if>
+            <if test="phone != null  and phone != ''"> and phone = #{phone}</if>
+            <if test="urls != null  and urls != ''"> and urls = #{urls}</if>
+            <if test="tradeImage != null  and tradeImage != ''"> and trade_image = #{tradeImage}</if>
+            <if test="account != null  and account != ''"> and account = #{account}</if>
+            <if test="isHandle != null "> and is_handle = #{isHandle}</if>
+            <if test="complaintsTime != null ">  and create_time &gt;= #{complaintsTime}</if>
+            <if test="complainteTime != null ">  and create_time &lt; date_add(#{complainteTime}, interval 1 day)</if>
+        </where>
+    </select>
+
+    <select id="selectFsUserComplaintById" parameterType="Long" resultType="com.fs.his.vo.FsUserComplaintVo">
+        select c.id, c.user_name, c.template_id, c.content, c.phone, c.urls,c.trade_image, c.account, c.create_time, c.is_handle,t.name,c.remarks
+        from fs_user_complaint c
+        left join fs_complaint_template t on c.template_id = t.id
+        where c.id = #{id}
+    </select>
+
+    <insert id="insertFsUserComplaint" parameterType="FsUserComplaint" useGeneratedKeys="true" keyProperty="id">
+        insert into fs_user_complaint
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="userName != null">user_name,</if>
+            <if test="templateId != null">template_id,</if>
+            <if test="content != null">content,</if>
+            <if test="phone != null">phone,</if>
+            <if test="urls != null">urls,</if>
+            <if test="tradeImage != null">trade_image,</if>
+            <if test="account != null">account,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="isHandle != null">is_handle,</if>
+            <if test="remarks != null">remarks,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="userName != null">#{userName},</if>
+            <if test="templateId != null">#{templateId},</if>
+            <if test="content != null">#{content},</if>
+            <if test="phone != null">#{phone},</if>
+            <if test="urls != null">#{urls},</if>
+            <if test="tradeImage != null">#{tradeImage},</if>
+            <if test="account != null">#{account},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="isHandle != null">#{isHandle},</if>
+            <if test="remarks != null">#{remarks},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsUserComplaint" parameterType="FsUserComplaint">
+        update fs_user_complaint
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="userName != null and userName !=''">user_name = #{userName},</if>
+            <if test="templateId != null">template_id = #{templateId},</if>
+            <if test="content != null">content = #{content},</if>
+            <if test="phone != null">phone = #{phone},</if>
+            <if test="urls != null and urls !=''">urls = #{urls},</if>
+            <if test="tradeImage != null and tradeImage !=''">trade_image = #{tradeImage},</if>
+            <if test="account != null">account = #{account},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="isHandle != null">is_handle = #{isHandle},</if>
+            <if test="remarks != null">remarks = #{remarks},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFsUserComplaintById" parameterType="Long">
+        delete from fs_user_complaint where id = #{id}
+    </delete>
+
+    <delete id="deleteFsUserComplaintByIds" parameterType="String">
+        delete from fs_user_complaint where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 1 - 1
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -1917,7 +1917,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT
             count( DISTINCT fs_user.user_id ) as userNum,
             count( DISTINCT CASE WHEN to_days( fs_user.create_time ) = to_days( now()) THEN fs_user.user_id END ) as newUserNum,
-            fs_user.company_id
+            fs_user_company_user.company_id
         FROM
             fs_user
                 LEFT JOIN fs_user_company_user ON fs_user_company_user.user_id = fs_user.user_id

+ 8 - 1
fs-service/src/main/resources/mapper/qw/QwUserVoiceLogMapper.xml

@@ -57,7 +57,7 @@
     </sql>
 
     <select id="selectQwUserVoiceLogList" resultMap="QwUserVoiceLogVoResult">
-        select uvl.id, ext_id, uvl.qw_user_id, duration, title, uvl.status, uvl.corp_id, uvl.company_id, uvl.company_user_id, uvl.create_time,qec.`name`,c.company_name,cu.user_name,qu.qw_user_name
+        select uvl.id, ext_id, uvl.qw_user_id, duration, title, uvl.status, uvl.corp_id, uvl.company_id, uvl.company_user_id, uvl.create_time,qec.`name`,qec.tag_ids,c.company_name,cu.user_name,qu.qw_user_name
         from qw_user_voice_log uvl
         left join qw_external_contact qec on uvl.ext_id = qec.id
         left join company c on uvl.company_id = c.company_id
@@ -68,6 +68,13 @@
             <if test="qwUserName != null "> and qu.qw_user_name like concat(#{qwUserName}, '%')</if>
             <if test="title != null  and title != ''"> and uvl.title = #{title}</if>
             <if test="status != null "> and uvl.status = #{status}</if>
+            <if test="tagIds != null">
+                and
+                <foreach collection="tagIds" item="tagId" separator="and">
+                    <!-- 使用JSON_CONTAINS检查JSON数组中是否包含指定元素 -->
+                    JSON_CONTAINS(qec.tag_ids, CONCAT('"', #{tagId}, '"'))
+                </foreach>
+            </if>
             <if test="corpId != null  and corpId != ''"> and uvl.corp_id = #{corpId}</if>
             <if test="companyId != null "> and c.company_id = #{companyId}</if>
             <if test="companyName != null "> and c.company_name like concat(#{companyName}, '%')</if>

+ 8 - 0
fs-user-app/src/main/java/com/fs/app/controller/CompanyUserController.java

@@ -173,4 +173,12 @@ public class CompanyUserController extends  AppBaseController {
 
     }
 
+    @ApiOperation("获取公司收款码")
+    @GetMapping("/getCompanyWxaCodeByPayment")
+    public R getCompanyWxaCodeByPayment(@RequestParam("companyId")Long companyId,HttpServletRequest request){
+        //获取用户码
+        String WxaCode = redisCache.getCacheObject("company-wxa-code:"+companyId);
+        return R.ok().put("data",WxaCode);
+    }
+
 }

+ 122 - 0
fs-user-app/src/main/java/com/fs/app/controller/FsUserComplaintController.java

@@ -0,0 +1,122 @@
+package com.fs.app.controller;
+
+import com.fs.app.annotation.Login;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.his.domain.FsComplaintTemplate;
+import com.fs.his.domain.FsUserComplaint;
+import com.fs.his.service.IFsComplaintTemplateService;
+import com.fs.his.service.IFsUserComplaintService;
+import com.fs.his.utils.ComplaintTreeUtil;
+import com.fs.his.vo.FsComplaintTemplateVO;
+import com.fs.his.vo.FsUserComplaintVo;
+import com.google.common.collect.Lists;
+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 2025-06-09
+ */
+@RestController
+@RequestMapping("/app/complaint")
+public class FsUserComplaintController extends AppBaseController
+{
+    @Autowired
+    private IFsUserComplaintService fsUserComplaintService;
+    @Autowired
+    private IFsComplaintTemplateService fsComplaintTemplateService;
+
+    /**
+     * 查询投诉模板列表
+     */
+    @GetMapping("/templateList")
+    public TableDataInfo list(FsComplaintTemplate fsComplaintTemplate)
+    {
+        startPage();
+        fsComplaintTemplate.setIsDel(0L);
+        List<FsComplaintTemplate> list = fsComplaintTemplateService.selectFsComplaintTemplateList(fsComplaintTemplate);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询投诉模板树形结果
+     */
+    @GetMapping("/treeList")
+    public R treeList(FsComplaintTemplate fsComplaintTemplate)
+    {
+        List<FsComplaintTemplate> list = fsComplaintTemplateService.selectFsComplaintTemplateList(fsComplaintTemplate);
+        List<FsComplaintTemplateVO> templateVOS = Lists.newArrayList();
+        for (FsComplaintTemplate template : list){
+            FsComplaintTemplateVO templateVO = new FsComplaintTemplateVO();
+            templateVO.setId(template.getId());
+            templateVO.setName(template.getName());
+            templateVO.setParentId(template.getParentId());
+            templateVO.setDescription(template.getDescription());
+            templateVO.setSort(template.getSort());
+            templateVOS.add(templateVO);
+        }
+        return R.ok().put("data", ComplaintTreeUtil.list2TreeConverter(templateVOS, 0));
+    }
+
+    /**
+     * 查询用户投诉列表
+     */
+//    @PreAuthorize("@ss.hasPermi('his:complaint:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsUserComplaint fsUserComplaint)
+    {
+        startPage();
+        List<FsUserComplaintVo> list = fsUserComplaintService.selectFsUserComplaintList(fsUserComplaint);
+        return getDataTable(list);
+    }
+
+
+
+    /**
+     * 获取用户投诉详细信息
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(fsUserComplaintService.selectFsUserComplaintById(id));
+    }
+
+    /**
+     * 新增用户投诉
+     */
+    @Login
+    @PostMapping
+    public AjaxResult add(@RequestBody FsUserComplaint fsUserComplaint)
+    {
+        String userId = getUserId();
+        fsUserComplaint.setUserId(Long.valueOf(userId));
+        return toAjax(fsUserComplaintService.insertFsUserComplaint(fsUserComplaint));
+    }
+
+    /**
+     * 修改用户投诉
+     */
+    @Login
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsUserComplaint fsUserComplaint)
+    {
+        return toAjax(fsUserComplaintService.updateFsUserComplaint(fsUserComplaint));
+    }
+
+    /**
+     * 删除用户投诉
+     */
+    @Login
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fsUserComplaintService.deleteFsUserComplaintByIds(ids));
+    }
+}

+ 62 - 0
fs-user-app/src/main/java/com/fs/app/controller/PaymentController.java

@@ -0,0 +1,62 @@
+package com.fs.app.controller;
+
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import com.fs.app.annotation.Login;
+import com.fs.common.annotation.RepeatSubmit;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.R;
+import com.fs.common.utils.IpUtil;
+import com.fs.core.config.WxMaConfiguration;
+import com.fs.his.service.IFsStorePaymentService;
+import com.fs.hisStore.domain.FsUserScrm;
+import com.fs.hisStore.param.FsStorePaymentGetWxaCodeParam;
+import com.fs.hisStore.param.FsStorePaymentPayParam;
+import com.fs.hisStore.service.IFsStorePaymentScrmService;
+import com.fs.hisStore.service.IFsUserScrmService;
+import com.fs.wx.miniapp.config.WxMaProperties;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Api("支付接口")
+@RestController
+@RequestMapping("/app/payment")
+public class PaymentController extends AppBaseController {
+    @Autowired
+    private WxMaProperties properties;
+    protected final Logger logger = LoggerFactory.getLogger(BaseController.class);
+
+    @Autowired
+    private IFsStorePaymentService paymentService;
+
+
+    @Login
+    @ApiOperation("收款订单支付")
+    @PostMapping("/paymentByWxaCode")
+    @RepeatSubmit
+    public R paymentByWxaCode(@Validated @RequestBody FsStorePaymentPayParam payment)
+    {
+        payment.setUserId(Long.parseLong(getUserId()));
+        return paymentService.paymentByWxaCode(payment);
+    }
+
+    @ApiOperation("生成收款页面小程序码")
+    @GetMapping("/getWxaCodeByPayment")
+    public R getWxaCodeByPayment(FsStorePaymentGetWxaCodeParam param)
+    {
+        return paymentService.getWxaCodeByPayment(param);
+    }
+
+
+
+
+}

+ 9 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/CompanyUserScrmController.java

@@ -11,6 +11,7 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.sign.Md5Utils;
+import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.domain.CompanyUserCard;
 import com.fs.company.param.CompanyUserLoginParam;
@@ -173,6 +174,14 @@ public class CompanyUserScrmController extends AppBaseController {
         }
     }
 
+    @ApiOperation("获取公司收款码")
+    @GetMapping("/getCompanyWxaCodeByPayment")
+    public R getCompanyWxaCodeByPayment(@RequestParam("companyId")Long companyId,HttpServletRequest request){
+        //获取用户码
+        String WxaCode = redisCache.getCacheObject("company-wxa-code:"+companyId);
+        return R.ok().put("data",WxaCode);
+    }
+
 
 
 }

+ 23 - 17
fs-user-app/src/main/java/com/fs/app/controller/store/PaymentController.java → fs-user-app/src/main/java/com/fs/app/controller/store/PaymentScrmController.java

@@ -3,6 +3,7 @@ package com.fs.app.controller.store;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import com.fs.app.annotation.Login;
 import com.fs.app.controller.AppBaseController;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.controller.BaseController;
@@ -10,6 +11,7 @@ import com.fs.common.core.domain.R;
 import com.fs.common.utils.IpUtil;
 import com.fs.core.config.WxMaConfiguration;
 import com.fs.hisStore.domain.FsUserScrm;
+import com.fs.hisStore.param.FsStorePaymentGetWxaCodeParam;
 import com.fs.hisStore.param.FsStorePaymentPayParam;
 import com.fs.hisStore.service.IFsStorePaymentScrmService;
 import com.fs.hisStore.service.IFsUserScrmService;
@@ -21,18 +23,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-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.util.Date;
 
 @Api("支付接口")
 @RestController
 @RequestMapping("/store/app/payment")
-public class PaymentController extends AppBaseController {
+public class PaymentScrmController extends AppBaseController {
     @Autowired
     private WxMaProperties properties;
     protected final Logger logger = LoggerFactory.getLogger(BaseController.class);
@@ -41,6 +39,7 @@ public class PaymentController extends AppBaseController {
     private IFsStorePaymentScrmService paymentService;
     @Autowired
     private IFsUserScrmService userService;
+
     @ApiOperation("支付")
     @PostMapping("/payment")
     @RepeatSubmit
@@ -51,17 +50,7 @@ public class PaymentController extends AppBaseController {
             WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(payment.getCode());
             FsUserScrm user=userService.selectFsUserByMaOpenId(session.getOpenid());
             if(user==null){
-                //创建
-                user=new FsUserScrm();
-                user.setUsername("");
-                user.setNickname("微信用户");
-                user.setStatus(1);
-                user.setMaOpenId(session.getOpenid());
-                user.setUnionId(session.getUnionid());
-                user.setIsWeixinAuth(0);
-                user.setLastIp(ip);
-                user.setCreateTime(new Date());
-                userService.insertFsUser(user);
+                return R.error("用户不存在,返回主页授权登录!");
             }
             payment.setUserId(user.getUserId());
             return paymentService.payment(payment);
@@ -74,6 +63,23 @@ public class PaymentController extends AppBaseController {
 
     }
 
+    @Login
+    @ApiOperation("收款订单支付")
+    @PostMapping("/paymentByWxaCode")
+    @RepeatSubmit
+    public R paymentByWxaCode(@Validated @RequestBody FsStorePaymentPayParam payment)
+    {
+        payment.setUserId(Long.parseLong(getUserId()));
+        return paymentService.paymentByWxaCode(payment);
+    }
+
+    @ApiOperation("生成收款页面小程序码")
+    @GetMapping("/getWxaCodeByPayment")
+    public R getWxaCodeByPayment(FsStorePaymentGetWxaCodeParam param)
+    {
+        return paymentService.getWxaCodeByPayment(param);
+    }
+