Ver Fonte

Merge remote-tracking branch 'origin/master'

yuhongqi há 3 dias atrás
pai
commit
44212e904f

+ 60 - 0
fs-admin/src/main/java/com/fs/course/controller/FsCoursePlaySourceConfigController.java

@@ -1,6 +1,7 @@
 package com.fs.course.controller;
 
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -19,11 +20,15 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.bean.BeanUtils;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsCoursePlaySourceConfig;
+import com.fs.course.enums.MiniProgramAgreementEnum;
 import com.fs.course.param.FsCoursePlaySourceConfigCreateParam;
 import com.fs.course.param.FsCoursePlaySourceConfigEditParam;
+import com.fs.course.param.MiniProgramAgreementParam;
 import com.fs.course.service.IFsCoursePlaySourceConfigService;
 import com.fs.course.vo.FsCoursePlaySourceConfigVO;
 import com.fs.framework.web.service.TokenService;
+import com.fs.his.domain.MiniProgramAgreement;
+import com.fs.his.service.MiniProgramAgreementService;
 import com.fs.system.service.ISysConfigService;
 import com.github.pagehelper.PageHelper;
 import lombok.AllArgsConstructor;
@@ -42,6 +47,7 @@ public class FsCoursePlaySourceConfigController extends BaseController {
     private final IFsCoursePlaySourceConfigService fsCoursePlaySourceConfigService;
     private final TokenService tokenService;
     private final ISysConfigService configService;
+    private final MiniProgramAgreementService miniProgramAgreementService;
 
 //    @PreAuthorize("@ss.hasPermi('course:playSourceConfig:list')")
     @GetMapping("/list")
@@ -183,4 +189,58 @@ public class FsCoursePlaySourceConfigController extends BaseController {
         }
         return R.ok().put("data", fsCoursePlaySourceConfigService.list(queryWrapper));
     }
+
+
+    @PreAuthorize("@ss.hasPermi('course:playSourceConfig:agreement')")
+    @Log(title = "小程序协议配置", businessType = BusinessType.UPDATE)
+    @PostMapping("/updateAgreementConfig")
+    public AjaxResult updateAgreementConfig(@RequestBody MiniProgramAgreementParam agreement) {
+        Map<String, String> map = (Map<String, String>) JSON.parse(agreement.getAgreementData());
+
+        List<MiniProgramAgreement> list = new ArrayList<>();
+        for (MiniProgramAgreementEnum agreementEnum : MiniProgramAgreementEnum.values()) {
+            String content = map.get(agreementEnum.getCode());
+            if (content != null) {
+                MiniProgramAgreement update = new MiniProgramAgreement();
+                update.setAppId(agreement.getAppId());
+                update.setAgreementType(agreementEnum.getCode());
+                update.setAgreementContent(content);
+
+                list.add(update);
+            }
+        }
+
+        if (!list.isEmpty()) {
+            miniProgramAgreementService.batchUpsertAgreements(list);
+        }
+
+        return AjaxResult.success();
+    }
+
+
+
+    @PreAuthorize("@ss.hasPermi('course:playSourceConfig:agreement')")
+    @GetMapping("/queryAgreementConfig")
+    public AjaxResult queryAgreementConfig(@RequestParam(required = true) String appid) {
+        // 查询协议数据
+        QueryWrapper<MiniProgramAgreement> queryWrapper = new QueryWrapper<MiniProgramAgreement>()
+                .eq("app_id", appid);
+        List<MiniProgramAgreement> agreements = miniProgramAgreementService.list(queryWrapper);
+
+        // 按agreementType分组
+        Map<String, String> agreementMap = new HashMap<>();
+        for (MiniProgramAgreement agreement : agreements) {
+            agreementMap.put(agreement.getAgreementType(), agreement.getAgreementContent());
+        }
+
+        // 转换为JSON串返回
+        String agreementData = JSON.toJSONString(agreementMap);
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("agreementData", agreementData);
+        result.put("appId", appid);
+
+        return AjaxResult.success(result);
+    }
+
 }

+ 49 - 0
fs-service/src/main/java/com/fs/course/enums/MiniProgramAgreementEnum.java

@@ -0,0 +1,49 @@
+package com.fs.course.enums;
+
+public enum MiniProgramAgreementEnum {
+
+    DOCTOR_REGISTER("doctorRegister", "医生注册协议"),
+    DOCTOR_FILING("doctorFiling", "医生多机构备案协议"),
+    USER_REGISTER("userRegister", "用户协议"),
+    USER_PRIVACY("userPrivacy", "隐私协议"),
+    USER_HEALTH("userHealth", "健康客服协议"),
+    VIP_SERVICE("vipService", "会员服务协议"),
+    VIP_AUTOMATIC_SERVICE("vipAutomaticService", "会员自动续费协议"),
+    USER_REMOVE_SERVICE("userRemoveService", "用户注销协议");
+    private String code;
+    private String message;
+    MiniProgramAgreementEnum(String code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public static MiniProgramAgreementEnum getEnum(String code) {
+        for (MiniProgramAgreementEnum value : MiniProgramAgreementEnum.values()) {
+            if (value.getCode().equals(code)) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+
+    public static String getMessage(String code) {
+        for (MiniProgramAgreementEnum value : MiniProgramAgreementEnum.values()) {
+            if (value.getCode().equals(code)) {
+                return value.getMessage();
+            }
+        }
+        return null;
+    }
+
+
+
+}

+ 32 - 0
fs-service/src/main/java/com/fs/course/param/MiniProgramAgreementParam.java

@@ -0,0 +1,32 @@
+package com.fs.course.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class MiniProgramAgreementParam {
+
+    // 小程序id
+    private String appId;
+
+    private String agreementData;
+
+//    // 医生注册协议
+//    private String doctorRegister;
+//    // 医生多机构备案协议
+//    private String doctorFiling;
+//    // 用户协议
+//    private String userRegister;
+//    // 隐私协议
+//    private String userPrivacy;
+//    // 健康客服协议
+//    private String userHealth;
+//    // 会员服务协议
+//    private String vipService;
+//    // 会员自动续费协议
+//    private String vipAutomaticService;
+//    // 用户注销协议
+//    private String userRemoveService;
+}

+ 3 - 0
fs-service/src/main/java/com/fs/his/config/AgreementConfig.java

@@ -12,4 +12,7 @@ public class AgreementConfig implements Serializable {
     String vipService;
     String vipAutomaticService;
     String userRemoveService;
+    String doctorRegister;
+    String doctorFiling;
+
 }

+ 104 - 0
fs-service/src/main/java/com/fs/his/domain/MiniProgramAgreement.java

@@ -0,0 +1,104 @@
+package com.fs.his.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 小程序用户协议信息表
+ * @TableName fs_mini_program_agreement
+ */
+@TableName(value ="fs_mini_program_agreement")
+@Data
+public class MiniProgramAgreement {
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 小程序ID
+     */
+    private String appId;
+
+    /**
+     * 协议类型
+     */
+    private String agreementType;
+
+    /**
+     * 协议内容
+     */
+    private String agreementContent;
+
+    /**
+     * 是否生效(0:否,1:是)
+     */
+    private Integer isActive;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        MiniProgramAgreement other = (MiniProgramAgreement) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getAppId() == null ? other.getAppId() == null : this.getAppId().equals(other.getAppId()))
+            && (this.getAgreementType() == null ? other.getAgreementType() == null : this.getAgreementType().equals(other.getAgreementType()))
+            && (this.getAgreementContent() == null ? other.getAgreementContent() == null : this.getAgreementContent().equals(other.getAgreementContent()))
+            && (this.getIsActive() == null ? other.getIsActive() == null : this.getIsActive().equals(other.getIsActive()))
+            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))
+            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getAppId() == null) ? 0 : getAppId().hashCode());
+        result = prime * result + ((getAgreementType() == null) ? 0 : getAgreementType().hashCode());
+        result = prime * result + ((getAgreementContent() == null) ? 0 : getAgreementContent().hashCode());
+        result = prime * result + ((getIsActive() == null) ? 0 : getIsActive().hashCode());
+        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
+        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", appId=").append(appId);
+        sb.append(", agreementType=").append(agreementType);
+        sb.append(", agreementContent=").append(agreementContent);
+        sb.append(", isActive=").append(isActive);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 23 - 0
fs-service/src/main/java/com/fs/his/mapper/MiniProgramAgreementMapper.java

@@ -0,0 +1,23 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.MiniProgramAgreement;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+/**
+* @author Administrator
+* @description 针对表【fs_mini_program_agreement(小程序用户协议信息表)】的数据库操作Mapper
+* @createDate 2026-01-08 17:17:17
+* @Entity generator.domain.MiniProgramAgreement
+*/
+public interface MiniProgramAgreementMapper extends BaseMapper<MiniProgramAgreement> {
+
+    void batchUpsertAgreements(@Param("agreements") List<MiniProgramAgreement> agreements);
+}
+
+
+
+

+ 17 - 0
fs-service/src/main/java/com/fs/his/service/MiniProgramAgreementService.java

@@ -0,0 +1,17 @@
+package com.fs.his.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.MiniProgramAgreement;
+
+import java.util.List;
+
+
+/**
+* @author Administrator
+* @description 针对表【fs_mini_program_agreement(小程序用户协议信息表)】的数据库操作Service
+* @createDate 2026-01-08 17:17:17
+*/
+public interface MiniProgramAgreementService extends IService<MiniProgramAgreement> {
+
+    void batchUpsertAgreements(List<MiniProgramAgreement> list);
+}

+ 28 - 0
fs-service/src/main/java/com/fs/his/service/impl/MiniProgramAgreementServiceImpl.java

@@ -0,0 +1,28 @@
+package com.fs.his.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.his.domain.MiniProgramAgreement;
+import com.fs.his.mapper.MiniProgramAgreementMapper;
+import com.fs.his.service.MiniProgramAgreementService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+* @author Administrator
+* @description 针对表【fs_mini_program_agreement(小程序用户协议信息表)】的数据库操作Service实现
+* @createDate 2026-01-08 17:17:17
+*/
+@Service
+public class MiniProgramAgreementServiceImpl extends ServiceImpl<MiniProgramAgreementMapper, MiniProgramAgreement>
+    implements MiniProgramAgreementService {
+
+    @Override
+    public void batchUpsertAgreements(List<MiniProgramAgreement> list) {
+        baseMapper.batchUpsertAgreements(list);
+    }
+}
+
+
+
+

+ 39 - 0
fs-service/src/main/resources/mapper/his/MiniProgramAgreementMapper.xml

@@ -0,0 +1,39 @@
+<?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.MiniProgramAgreementMapper">
+
+    <resultMap id="BaseResultMap" type="com.fs.his.domain.MiniProgramAgreement">
+            <id property="id" column="id" />
+            <result property="appId" column="app_id" />
+            <result property="agreementType" column="agreement_type" />
+            <result property="agreementContent" column="agreement_content" />
+            <result property="isActive" column="is_active" />
+            <result property="createTime" column="create_time" />
+            <result property="updateTime" column="update_time" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,app_id,agreement_type,agreement_content,is_active,create_time,
+        update_time
+    </sql>
+
+
+    <insert id="batchUpsertAgreements" parameterType="java.util.List">
+        INSERT INTO fs_mini_program_agreement (
+        app_id,
+        agreement_type,
+        agreement_content
+        ) VALUES
+        <foreach collection="agreements" item="item" separator=",">
+            (
+            #{item.appId},
+            #{item.agreementType},
+            #{item.agreementContent}
+            )
+        </foreach>
+        ON DUPLICATE KEY UPDATE
+        agreement_content = VALUES(agreement_content)
+    </insert>
+</mapper>

+ 2 - 2
fs-service/src/main/resources/mapper/hisStore/MergedOrderMapper.xml

@@ -46,7 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         fss.store_id as storeId,
         fss.store_name as storeName,
         fspcs.cate_name as cateName,
-        GROUP_CONCAT(JSON_UNQUOTE(JSON_EXTRACT(o.item_json, '$.barCode')) SEPARATOR ',') AS barCode,
+        GROUP_CONCAT(JSON_UNQUOTE(JSON_EXTRACT(item_latest.json_info, '$.barCode')) SEPARATOR ',') AS barCode,
 
       c.company_name,
       cu.user_name AS sales_name,
@@ -191,7 +191,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     fss.store_id as storeId,
     fss.store_name as storeName,
     fspcs.cate_name as cateName,
-    GROUP_CONCAT(JSON_UNQUOTE(JSON_EXTRACT(o.item_json, '$.barCode')) SEPARATOR ',') AS barCode,
+    GROUP_CONCAT(JSON_UNQUOTE(JSON_EXTRACT(item_latest.json_info, '$.barCode')) SEPARATOR ',') AS barCode,
 
       c.company_name,
       cu.user_name AS sales_name,

+ 89 - 0
fs-user-app/src/main/java/com/fs/app/controller/H5Controller.java

@@ -1,14 +1,22 @@
 package com.fs.app.controller;
 
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fs.common.core.domain.R;
+import com.fs.course.enums.MiniProgramAgreementEnum;
 import com.fs.his.config.AgreementConfig;
+import com.fs.his.domain.MiniProgramAgreement;
+import com.fs.his.service.MiniProgramAgreementService;
 import com.fs.system.service.ISysConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.servlet.ModelAndView;
 
+import java.util.Objects;
+
 @Controller
 @RequestMapping(value="/web")
 public class H5Controller
@@ -17,6 +25,9 @@ public class H5Controller
     @Autowired
     private ISysConfigService configService;
 
+    @Autowired
+    private MiniProgramAgreementService miniProgramAgreementService;
+
 
     @GetMapping("/userAgreement")
     public ModelAndView userAgreement( )
@@ -87,4 +98,82 @@ public class H5Controller
     }
 
 
+    /**
+     * @Description: 协议接口
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/1/9 11:31
+     */
+    @GetMapping("/getAgreementConfig")
+    public ModelAndView getAgreementConfig(@RequestParam("appId") String appId,
+                                           @RequestParam("agreementType") String agreementType) {
+        ModelAndView mv = new ModelAndView();
+
+        // 根据appId和code查询小程序用户信息
+        MiniProgramAgreement agreement = miniProgramAgreementService.getOne(
+                new QueryWrapper<MiniProgramAgreement>()
+                        .eq("app_id", appId)
+                        .eq("agreement_type", agreementType)
+        );
+
+        if (agreement != null) {
+            mv.addObject("agreementBody", agreement.getAgreementContent());
+            mv.addObject("agreementTitle", MiniProgramAgreementEnum.getMessage(agreementType));
+            mv.setViewName("commonAgreement");
+            return mv;
+        } else {// 老配置 后期不用了
+            String json = configService.selectConfigByKey("his.agreementConfig");
+            AgreementConfig config = JSONUtil.toBean(json, AgreementConfig.class);
+            MiniProgramAgreementEnum agreementEnum = MiniProgramAgreementEnum.getEnum(agreementType);
+
+            // 修复方案
+            if (agreementEnum == null) {
+                mv.addObject("agreementBody", "<div class=\"error-message\"><h3>暂未找到该协议内容</h3><p>请确认协议类型是否正确,或联系管理员配置相关协议内容。</p></div>");
+                mv.addObject("agreementTitle", agreementType);
+
+                mv.setViewName("commonAgreement");
+                return mv;
+            }
+
+
+            String data = null;
+            switch (agreementEnum) {
+                case USER_REGISTER:
+                    data = config.getUserRegister();
+                    break;
+                case USER_PRIVACY:
+                    data = config.getUserPrivacy();
+                    break;
+                case USER_HEALTH:
+                    data = config.getUserHealth();
+                    break;
+                case VIP_SERVICE:
+                    data = config.getVipService();
+                    break;
+                case VIP_AUTOMATIC_SERVICE:
+                    data = config.getVipAutomaticService();
+                    break;
+                case USER_REMOVE_SERVICE:
+                    data = config.getUserRemoveService();
+                    break;
+                case DOCTOR_REGISTER:
+                    data = config.getDoctorRegister();
+                    break;
+                case DOCTOR_FILING:
+                    data = config.getDoctorFiling();
+                    break;
+                default:
+                    agreementType="notFound";
+                    data="<div class=\"error-message\"><h3>暂未找到该协议内容</h3><p>请确认协议类型是否正确,或联系管理员配置相关协议内容。</p></div>";
+                    break;
+            }
+
+            mv.addObject("agreementBody", data);
+            mv.addObject("agreementTitle", MiniProgramAgreementEnum.getMessage(agreementType));
+            mv.setViewName("commonAgreement");
+            return mv;
+        }
+    }
+
 }

+ 21 - 0
fs-user-app/src/main/resources/templates/commonAgreement.html

@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
+    <title  th:text="${agreementTitle}"></title>
+    <link  rel="stylesheet"/>
+    <style>
+        body{
+            background-color:#F8F8F8;
+        }
+    </style>
+<body>
+<div th:utext="${agreementBody}" ></div>
+<script th:inline="javascript">
+
+</script>
+
+</body>
+</html>