陈昶聿
昨天 fcb98e4558897945a316d04555923355b8e60605
Merge branch 'master' into master-任务组
已修改36个文件
已添加18个文件
4483 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/SmsController.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/MedicationDoseInfoController.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/MedicationItemController.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/QRCodeController.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceAppointRecordController.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceOutPathController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskAnswerController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/HttpUtil.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/sms/smsUtils.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java 294 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserDeptMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysUserDeptMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/MedicationDoseInfo.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/MedicationItem.java 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatMedInhosp.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceAppointRecord.java 453 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceOutPath.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceTaskScriptQues.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceTaskVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/MedicationDoseInfoMapper.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/MedicationItemMapper.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceAppointRecordMapper.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IMedicationDoseInfoService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IMedicationItemService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceAppointRecordService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceOutPathService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSLTDHealthcareRecordService.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IXHGatherPatArchiveService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/MedicationDoseInfoServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/MedicationItemServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceAppointRecordServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceOutPathServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java 194 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceTaskServiceImpl.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/XHGatherPatArchiveServiceImpl.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/MedicationDoseInfoMapper.xml 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/MedicationItemMapper.xml 434 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceAppointRecordMapper.xml 803 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceOutPathMapper.xml 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceTaskMapper.xml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SysUserDeptMapper.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java
@@ -42,6 +42,7 @@
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -110,6 +111,9 @@
    @Value("${xhsmsPwd}")
    private String xhsmsPwd;
    // è™šæ‹ŸæŽ¥å…¥ç 
    @Value("${xhsmsjrm}")
    private String xhsmsjrm;
    @Value("${server.port}")
    private String port;
@@ -306,21 +310,26 @@
                        serviceOutPath.setParam6(subId);
                        serviceOutPath.setCreateTime(new Date());
                        serviceOutPath.setOrgid(serviceSubtask.getOrgid());
                        serviceOutPath.setDeptCode(serviceSubtask.getDeptcode());
                        serviceOutPath.setWardCode(serviceSubtask.getLeavehospitaldistrictcode());
                        serviceOutPath.setDeptName(serviceSubtask.getDeptname());
                        serviceOutPath.setWardName(serviceSubtask.getLeavehospitaldistrictname());
                        iServiceOutPathService.insertServiceOutPath(serviceOutPath);
//                                sendMagParam.setUrl(ip + ":" + req_path + "/followvisit/particty?param1=" + taskId + "&param2=" + patid + "&param5=false");
                        //转成16进制
                        String format = String.format("%03X", serviceOutPath.getId());
                        serviceOutPath.setRadix(format);
                        serviceOutPath.setUpdateTime(new Date());
                        serviceOutPath.setUrl(ip + ":" + req_path + "/sf?p=" + format);
                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                        sendMagParam.setPhone(serviceSubtask.getPhone());
                        sendMagParam.setUrl(ip + ":" + req_path + "/sf?p=" + format);
                        SysConfig sysConfig = new SysConfig();
                        if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("6")) {
                            sysConfig = sysConfigMapper.checkConfigKeyUnique("zymyd.sms.template");
                        }else if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("14")) {
                        } else if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("14")) {
                            sysConfig = sysConfigMapper.checkConfigKeyUnique("mzmyd.sms.template");
                        }else {
                        } else {
                            sysConfig = sysConfigMapper.checkConfigKeyUnique("wj.sms.template");
                        }
                        if (!Objects.isNull(sysConfig)) {
@@ -339,10 +348,15 @@
                        serviceOutPath.setParam3(ivrTask1.getTaskName());
                        serviceOutPath.setCreateTime(new Date());
                        serviceOutPath.setOrgid(serviceSubtask.getOrgid());
                        serviceOutPath.setDeptCode(serviceSubtask.getDeptcode());
                        serviceOutPath.setWardCode(serviceSubtask.getLeavehospitaldistrictcode());
                        serviceOutPath.setDeptName(serviceSubtask.getDeptname());
                        serviceOutPath.setWardName(serviceSubtask.getLeavehospitaldistrictname());
                        iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                        String format = String.format("%03X", serviceOutPath.getId());
                        serviceOutPath.setRadix(format);
                        serviceOutPath.setUpdateTime(new Date());
                        serviceOutPath.setUrl(StringUtils.isNotEmpty(req_path) ? ip + ":" + req_path + "/wt?p=" + format : ip + "/wt?p=" + format);
                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
//                                sendMagParam.setUrl(ip + ":" + req_path + "/outsideChainwt?param1=" + taskId + "&param2=" + patid + "&param3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) + "&param5=false");
                        sendMagParam.setPhone(serviceSubtask.getPhone());
@@ -355,9 +369,9 @@
                        SysConfig sysConfig = new SysConfig();
                        if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("6")) {
                            sysConfig = sysConfigMapper.checkConfigKeyUnique("zymyd.sms.template");
                        }else if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("14")) {
                        } else if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("14")) {
                            sysConfig = sysConfigMapper.checkConfigKeyUnique("mzmyd.sms.template");
                        }else {
                        } else {
                            sysConfig = sysConfigMapper.checkConfigKeyUnique("wj.sms.template");
                        }
                        if (!Objects.isNull(sysConfig)) {
@@ -374,6 +388,10 @@
                        serviceOutPath.setParam3(ivrTask1.getTaskName());
                        serviceOutPath.setCreateTime(new Date());
                        serviceOutPath.setOrgid(serviceSubtask.getOrgid());
                        serviceOutPath.setDeptCode(serviceSubtask.getDeptcode());
                        serviceOutPath.setWardCode(serviceSubtask.getLeavehospitaldistrictcode());
                        serviceOutPath.setDeptName(serviceSubtask.getDeptname());
                        serviceOutPath.setWardName(serviceSubtask.getLeavehospitaldistrictname());
                        iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                        String format = String.format("%03X", serviceOutPath.getId());
                        serviceOutPath.setRadix(format);
@@ -412,15 +430,28 @@
                    String s = null;
                    if (active.equals("xh")) {
                        //新华的短信发送方式
                        Map<String, String> req = new HashMap<>();
                        req.put("phone", sendMagParam.getPhone());
                        req.put("content", sendMagParam.getContent());
                        log.info("content返回值的内容是:{}", sendMagParam.getContent());
                        s = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(req));
                    } else if (active.equals("ls")) {
//                        String url = configService.selectConfigByKey("token.360", serviceSubtask.getOrgid());
//                        log.info("-------00token.360的URL为:{}", url);
                        Map<String, String> map2 = new HashMap<String, String>();
                        map2.put("action", "send");
                        map2.put("account", xhsmsAccount);
                        map2.put("password", xhsmsPwd);
                        map2.put("mobile", sendMagParam.getPhone());
                        map2.put("content", sendMagParam.getContent());
                        map2.put("extno", xhsmsjrm);
                        map2.put("rt", "json");
                        StringBuilder encodedParams = new StringBuilder();
                        for (Map.Entry<String, String> entry : map2.entrySet()) {
                            if (encodedParams.length() > 0) {
                                encodedParams.append("&");
                            }
                            // å¯¹é”®å’Œå€¼è¿›è¡ŒURL编码
                            String encodedKey = URLEncoder.encode(entry.getKey(), "UTF-8");
                            String encodedValue = URLEncoder.encode(entry.getValue(), "UTF-8");
                            encodedParams.append(encodedKey).append("=").append(encodedValue);
                        }
                        Boolean isSuccess = HttpUtil.postJsonRequest(xhsmsPath, encodedParams.toString());
                        if (isSuccess) s = "true";
                    } else if (active.equals("ls")) {
                        //丽水的短信发送方式
                        SysConfig config = new SysConfig();
                        config.setConfigKey("ls.msg.info");
@@ -492,7 +523,8 @@
                        String sign = Md5Utils.hash(xhsmsAccount + timestamp + Md5Utils.hash(xhsmsPwd));
                        String content = sendMagParam.getContent();
                        String jsonMsg = "{" + "\"userName\": \"" + xhsmsAccount + "\"," + "\"content\": \"" + content + "\"," + "\"phoneList\": [" + sendMagParam.getPhone() + "]," + "\"timestamp\": " + timestamp + "," + "\"sign\": \"" + sign + "\"" + "}";
                        s = HttpUtil.postJsonRequest(xhsmsPath, jsonMsg);
                        Boolean b = HttpUtil.postJsonRequest(xhsmsPath, jsonMsg);
                        if (b) s = "true";
                        log.info("------市一短信发送的值为:{}", s);
                        if (StringUtils.isNotEmpty(s)) {
                            JSONObject jsonObject = JSONObject.parseObject(s);
@@ -559,6 +591,10 @@
                        serviceOutPath.setParam6(subId);
                        serviceOutPath.setCreateTime(new Date());
                        serviceOutPath.setOrgid(serviceSubtask.getOrgid());
                        serviceOutPath.setDeptCode(serviceSubtask.getDeptcode());
                        serviceOutPath.setWardCode(serviceSubtask.getLeavehospitaldistrictcode());
                        serviceOutPath.setDeptName(serviceSubtask.getDeptname());
                        serviceOutPath.setWardName(serviceSubtask.getLeavehospitaldistrictname());
                        iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                        String format = String.format("%03X", serviceOutPath.getId());
                        serviceOutPath.setRadix(format);
@@ -574,6 +610,10 @@
                        serviceOutPath.setParam6(subId);
                        serviceOutPath.setCreateTime(new Date());
                        serviceOutPath.setOrgid(serviceSubtask.getOrgid());
                        serviceOutPath.setDeptCode(serviceSubtask.getDeptcode());
                        serviceOutPath.setWardCode(serviceSubtask.getLeavehospitaldistrictcode());
                        serviceOutPath.setDeptName(serviceSubtask.getDeptname());
                        serviceOutPath.setWardName(serviceSubtask.getLeavehospitaldistrictname());
                        iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                        String format = String.format("%03X", serviceOutPath.getId());
                        serviceOutPath.setRadix(format);
@@ -591,6 +631,10 @@
                        serviceOutPath.setParam3(ivrTask1.getTaskName());
                        serviceOutPath.setParam6(subId);
                        serviceOutPath.setCreateTime(new Date());
                        serviceOutPath.setDeptCode(serviceSubtask.getDeptcode());
                        serviceOutPath.setWardCode(serviceSubtask.getLeavehospitaldistrictcode());
                        serviceOutPath.setDeptName(serviceSubtask.getDeptname());
                        serviceOutPath.setWardName(serviceSubtask.getLeavehospitaldistrictname());
                        serviceOutPath.setOrgid(serviceSubtask.getOrgid());
                        iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                        String format = String.format("%03X", serviceOutPath.getId());
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/SmsController.java
@@ -8,6 +8,7 @@
import com.ruoyi.common.utils.HttpUtil;
import com.ruoyi.common.utils.RSAPublicKeyExample;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.common.utils.sms.smsUtils;
import com.smartor.common.MtSubmitSmUtil;
import com.smartor.common.ShiyiSmsUtil;
@@ -29,6 +30,7 @@
import org.springframework.web.bind.annotation.RestController;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
@@ -54,6 +56,9 @@
    @Value("${xhsmsPwd}")
    private String xhsmsPwd;
    // è™šæ‹ŸæŽ¥å…¥ç 
    @Value("${xhsmsjrm}")
    private String xhsmsjrm;
    @Value("${localIP}")
    private String ip;
@@ -143,10 +148,33 @@
                    }
                }
            } else if (active.equals("xh")) {
                Map<String, String> req = new HashMap<>();
                req.put("phone", vo.getPhone());
                req.put("content", vo.getContent());
                sendMsg = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(req));
//                Map<String, String> req = new HashMap<>();
//                req.put("phone", vo.getPhone());
//                req.put("content", vo.getContent());
//                Boolean result = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(req));
                Map<String, String> map2 = new HashMap<String, String>();
                map2.put("action", "send");
                map2.put("account", xhsmsAccount);
                map2.put("password", xhsmsPwd);
                map2.put("mobile", vo.getPhone());
                map2.put("content", vo.getContent());
                map2.put("extno", xhsmsjrm);
                map2.put("rt", "json");
                StringBuilder encodedParams = new StringBuilder();
                for (Map.Entry<String, String> entry : map2.entrySet()) {
                    if (encodedParams.length() > 0) {
                        encodedParams.append("&");
                    }
                    // å¯¹é”®å’Œå€¼è¿›è¡ŒURL编码
                    String encodedKey = URLEncoder.encode(entry.getKey(), "UTF-8");
                    String encodedValue = URLEncoder.encode(entry.getValue(), "UTF-8");
                    encodedParams.append(encodedKey).append("=").append(encodedValue);
                }
                Boolean result = HttpUtils.sendPost(xhsmsPath, encodedParams.toString());
                if (result) {
                    sendMsg = "true";
                }
            } else if (active.equals("ls")) {
                //丽水13家医院,有点不方便,有空再接
                return AjaxResult.error("该短信功能还未开通");
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/MedicationDoseInfoController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
package com.ruoyi.web.controller.smartor;
import com.ruoyi.common.annotation.AddOrgId;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.MedicationDoseInfo;
import com.smartor.service.IMedicationDoseInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * è¯å“å‰‚量信息Controller
 *
 * @author lihu
 * @date 2026-07-17
 */
@Api("药品剂量信息")
@RestController
@RequestMapping("/smartor/medicationDoseInfo")
public class MedicationDoseInfoController extends BaseController
{
    @Autowired
    private IMedicationDoseInfoService medicationDoseInfoService;
    /**
     * æŸ¥è¯¢è¯å“å‰‚量信息列表
     */
    @ApiOperation("查询药品剂量信息列表")
    //@PreAuthorize("@ss.hasPermi('smartor:info:list')")
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/list")
    public TableDataInfo list(@RequestBody MedicationDoseInfo medicationDoseInfo)
    {
        startPage();
        List<MedicationDoseInfo> list = medicationDoseInfoService.selectMedicationDoseInfoList(medicationDoseInfo);
        return getDataTable(list);
    }
    /**
     * å¯¼å‡ºè¯å“å‰‚量信息列表
     */
    @ApiOperation("导出药品剂量信息列表")
    //@PreAuthorize("@ss.hasPermi('smartor:info:export')")
    @Log(title = "药品剂量信息", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, MedicationDoseInfo medicationDoseInfo)
    {
        List<MedicationDoseInfo> list = medicationDoseInfoService.selectMedicationDoseInfoList(medicationDoseInfo);
        ExcelUtil<MedicationDoseInfo> util = new ExcelUtil<MedicationDoseInfo>(MedicationDoseInfo.class);
        util.exportExcel(response, list, "药品剂量信息数据");
    }
    /**
     * èŽ·å–è¯å“å‰‚é‡ä¿¡æ¯è¯¦ç»†ä¿¡æ¯
     */
    @ApiOperation("获取药品剂量信息详细信息")
    //@PreAuthorize("@ss.hasPermi('smartor:info:query')")
    @GetMapping(value = "/getInfo/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id)
    {
        return success(medicationDoseInfoService.selectMedicationDoseInfoById(id));
    }
    /**
     * æ–°å¢žè¯å“å‰‚量信息
     */
    @ApiOperation("新增药品剂量信息")
    //@PreAuthorize("@ss.hasPermi('smartor:info:add')")
    @Log(title = "药品剂量信息", businessType = BusinessType.INSERT)
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody MedicationDoseInfo medicationDoseInfo)
    {
        return toAjax(medicationDoseInfoService.insertMedicationDoseInfo(medicationDoseInfo));
    }
    /**
     * ä¿®æ”¹è¯å“å‰‚量信息
     */
    @ApiOperation("修改药品剂量信息")
    //@PreAuthorize("@ss.hasPermi('smartor:info:edit')")
    @Log(title = "药品剂量信息", businessType = BusinessType.UPDATE)
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/edit")
    public AjaxResult edit(@RequestBody MedicationDoseInfo medicationDoseInfo)
    {
        return toAjax(medicationDoseInfoService.updateMedicationDoseInfo(medicationDoseInfo));
    }
    /**
     * åˆ é™¤è¯å“å‰‚量信息
     */
    @ApiOperation("删除药品剂量信息")
    //@PreAuthorize("@ss.hasPermi('smartor:info:remove')")
    @Log(title = "药品剂量信息", businessType = BusinessType.DELETE)
    @GetMapping("/remove/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids)
    {
        return toAjax(medicationDoseInfoService.deleteMedicationDoseInfoByIds(ids));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/MedicationItemController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
package com.ruoyi.web.controller.smartor;
import com.ruoyi.common.annotation.AddOrgId;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.MedicationItem;
import com.smartor.service.IMedicationItemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * è¯å“ä¿¡æ¯Controller
 *
 * @author lihu
 * @date 2026-07-17
 */
@Api("药品信息")
@RestController
@RequestMapping("/smartor/medicationitem")
public class MedicationItemController extends BaseController {
    @Autowired
    private IMedicationItemService medicationItemService;
    /**
     * æŸ¥è¯¢è¯å“ä¿¡æ¯åˆ—表
     */
    @ApiOperation("查询药品信息列表")
    //@PreAuthorize("@ss.hasPermi('smartor:item:list')")
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/list")
    public TableDataInfo list(@RequestBody MedicationItem medicationItem) {
        startPage();
        List<MedicationItem> list = medicationItemService.selectMedicationItemList(medicationItem);
        return getDataTable(list);
    }
    /**
     * å¯¼å‡ºè¯å“ä¿¡æ¯åˆ—表
     */
    @ApiOperation("导出药品信息列表")
    //@PreAuthorize("@ss.hasPermi('smartor:item:export')")
    @Log(title = "药品信息", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, MedicationItem medicationItem) {
        List<MedicationItem> list = medicationItemService.selectMedicationItemList(medicationItem);
        ExcelUtil<MedicationItem> util = new ExcelUtil<MedicationItem>(MedicationItem.class);
        util.exportExcel(response, list, "药品信息数据");
    }
    /**
     * èŽ·å–è¯å“ä¿¡æ¯è¯¦ç»†ä¿¡æ¯
     */
    @ApiOperation("获取药品信息详细信息")
    //@PreAuthorize("@ss.hasPermi('smartor:item:query')")
    @GetMapping(value = "/getInfo/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id) {
        return success(medicationItemService.selectMedicationItemById(id));
    }
    /**
     * æ–°å¢žè¯å“ä¿¡æ¯
     */
    @ApiOperation("新增药品信息")
    //@PreAuthorize("@ss.hasPermi('smartor:item:add')")
    @Log(title = "药品信息", businessType = BusinessType.INSERT)
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody MedicationItem medicationItem) {
        return toAjax(medicationItemService.insertMedicationItem(medicationItem));
    }
    /**
     * ä¿®æ”¹è¯å“ä¿¡æ¯
     */
    @ApiOperation("修改药品信息")
    //@PreAuthorize("@ss.hasPermi('smartor:item:edit')")
    @Log(title = "药品信息", businessType = BusinessType.UPDATE)
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/edit")
    public AjaxResult edit(@RequestBody MedicationItem medicationItem) {
        return toAjax(medicationItemService.updateMedicationItem(medicationItem));
    }
    /**
     * åˆ é™¤è¯å“ä¿¡æ¯
     */
    @ApiOperation("删除药品信息")
    //@PreAuthorize("@ss.hasPermi('smartor:item:remove')")
    @Log(title = "药品信息", businessType = BusinessType.DELETE)
    @GetMapping("/remove/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids) {
        return toAjax(medicationItemService.deleteMedicationItemByIds(ids));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/QRCodeController.java
@@ -1,10 +1,12 @@
package com.ruoyi.web.controller.smartor;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.mchange.v2.uid.UidUtils;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.framework.config.ServerConfig;
@@ -21,10 +23,17 @@
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.net.URI;
import java.util.*;
@Slf4j
@@ -41,6 +50,11 @@
    @Value("${ruoyi.profile}")
    private String profile;
    /**
     * å…¬å¸logo在classpath中的路径,打包进jar后任何环境都能读取到
     */
    private static final String LOGO_CLASSPATH = "/images/hrslogo.png";
    @Autowired
    private ServerConfig serverConfig;
@@ -122,24 +136,85 @@
    @PostMapping(value = "/getQRcode")
    public AjaxResult getQRcode(@RequestParam("url") String url) {
        log.info("获取问卷二维码的入参:{}", url);
        String uuid = UUID.randomUUID().toString().replace("-", "");
        String filePath = profile + "\\qrpath" + "\\" + uuid + ".png"; // ä¿å­˜äºŒç»´ç å›¾åƒçš„æ–‡ä»¶è·¯å¾„
        // å°è¯•从url中提取p参数的值作为图片名称,值为空则用UUID
        String fileName = UUID.randomUUID().toString().replace("-", "");
        try {
            URI uri = new URI(url);
            String query = uri.getQuery();
            if (query != null) {
                for (String param : query.split("&")) {
                    String[] pair = param.split("=", 2);
                    if ("p".equals(pair[0]) && pair.length > 1 && !pair[1].isEmpty()) {
                        fileName = pair[1] + "-" + System.currentTimeMillis();
                        break;
                    }
                }
            }
        } catch (Exception e) {
            log.warn("解析url中的p参数失败,使用UUID作为文件名");
        }
        String filePath = profile + "\\qrpath" + "\\" + fileName + ".png"; // ä¿å­˜äºŒç»´ç å›¾åƒçš„æ–‡ä»¶è·¯å¾„
        //判断文件夹是否存在
        File file = new File(profile + "\\qrpath");
        if (!file.exists()) {
            file.mkdirs();
        }
        generateQRCode(url, filePath);
        return AjaxResult.success(serverConfig.getUrl() + "/profile/qrpath/" + uuid + ".png");
        return AjaxResult.success(serverConfig.getUrl() + "/profile/qrpath/" + fileName + ".png");
    }
    private void generateQRCode(String url, String filePath) {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        try {
            BitMatrix bitMatrix = qrCodeWriter.encode(url, BarcodeFormat.QR_CODE, 500, 500);
            // ä½¿ç”¨é«˜å®¹é”™çº§åˆ«ï¼ˆH级,30%容错),确保二维码中间嵌入logo后仍可正常扫描
            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            hints.put(EncodeHintType.MARGIN, 1);
            BitMatrix bitMatrix = qrCodeWriter.encode(url, BarcodeFormat.QR_CODE, 500, 500, hints);
            // å°†BitMatrix转为二值BufferedImage(黑白)
            BufferedImage binaryImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
            // åˆ›å»ºRGB彩色图像,把二维码画上去,否则后续绘制logo会丢失颜色
            BufferedImage qrImage = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics = qrImage.createGraphics();
            graphics.setColor(Color.WHITE);
            graphics.fillRect(0, 0, 500, 500);
            graphics.drawImage(binaryImage, 0, 0, null);
            // ä»Žclasspath读取logo并绘制到二维码中间
            try (InputStream logoStream = this.getClass().getResourceAsStream(LOGO_CLASSPATH)) {
                if (logoStream != null) {
                    BufferedImage logoImage = ImageIO.read(logoStream);
                    // è®¡ç®—logo尺寸,设为二维码的1/5
                    int logoWidth = qrImage.getWidth() / 5;
                    int logoHeight = qrImage.getHeight() / 5;
                    // è®¡ç®—logo居中位置
                    int logoX = (qrImage.getWidth() - logoWidth) / 2;
                    int logoY = (qrImage.getHeight() - logoHeight) / 2;
                    // ç»˜åˆ¶ç™½è‰²åœ†è§’背景,让logo更突出
                    int padding = 6;
                    graphics.setColor(Color.WHITE);
                    graphics.fillRoundRect(logoX - padding, logoY - padding, logoWidth + padding * 2, logoHeight + padding * 2, 10, 10);
                    // ç»˜åˆ¶logo
                    graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                    graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                    graphics.drawImage(logoImage, logoX, logoY, logoWidth, logoHeight, null);
                } else {
                    log.warn("classpath中未找到二维码logo: {}", LOGO_CLASSPATH);
                }
            }
            graphics.dispose();
            // è¾“出最终图片
            File outputFile = new File(filePath);
            MatrixToImageWriter.writeToPath(bitMatrix, "PNG", outputFile.toPath());
            ImageIO.write(qrImage, "PNG", outputFile);
        } catch (WriterException | IOException e) {
            e.printStackTrace();
        }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceAppointRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
package com.ruoyi.web.controller.smartor;
import com.ruoyi.common.annotation.AddOrgId;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.ServiceAppointRecord;
import com.smartor.service.IServiceAppointRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * é¢„约记录Controller
 *
 * @author lihu
 * @date 2026-07-06
 */
@Api("预约记录")
@RestController
@RequestMapping("/smartor/record")
public class ServiceAppointRecordController extends BaseController {
    @Autowired
    private IServiceAppointRecordService serviceAppointRecordService;
    /**
     * æŸ¥è¯¢é¢„约记录列表
     */
    @ApiOperation("查询预约记录列表")
    //@PreAuthorize("@ss.hasPermi('smartor:record:list')")
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/list")
    public TableDataInfo list(@RequestBody ServiceAppointRecord serviceAppointRecord) {
        startPage();
        List<ServiceAppointRecord> list = serviceAppointRecordService.selectServiceAppointRecordList(serviceAppointRecord);
        return getDataTable(list);
    }
    /**
     * å¯¼å‡ºé¢„约记录列表
     */
    @ApiOperation("导出预约记录列表")
    //@PreAuthorize("@ss.hasPermi('smartor:record:export')")
    @Log(title = "预约记录", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ServiceAppointRecord serviceAppointRecord) {
        List<ServiceAppointRecord> list = serviceAppointRecordService.selectServiceAppointRecordList(serviceAppointRecord);
        ExcelUtil<ServiceAppointRecord> util = new ExcelUtil<ServiceAppointRecord>(ServiceAppointRecord.class);
        util.exportExcel(response, list, "预约记录数据");
    }
    /**
     * èŽ·å–é¢„çº¦è®°å½•è¯¦ç»†ä¿¡æ¯
     */
    @ApiOperation("获取预约记录详细信息")
    //@PreAuthorize("@ss.hasPermi('smartor:record:query')")
    @GetMapping(value = "/getInfo/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id) {
        return success(serviceAppointRecordService.selectServiceAppointRecordById(id));
    }
    /**
     * æ–°å¢žé¢„约记录
     */
    @ApiOperation("新增预约记录")
    //@PreAuthorize("@ss.hasPermi('smartor:record:add')")
    @Log(title = "预约记录", businessType = BusinessType.INSERT)
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody ServiceAppointRecord serviceAppointRecord) {
        return toAjax(serviceAppointRecordService.insertServiceAppointRecord(serviceAppointRecord));
    }
    /**
     * ä¿®æ”¹é¢„约记录
     */
    @ApiOperation("修改预约记录")
    //@PreAuthorize("@ss.hasPermi('smartor:record:edit')")
    @Log(title = "预约记录", businessType = BusinessType.UPDATE)
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/edit")
    public AjaxResult edit(@RequestBody ServiceAppointRecord serviceAppointRecord) {
        return toAjax(serviceAppointRecordService.updateServiceAppointRecord(serviceAppointRecord));
    }
    /**
     * åˆ é™¤é¢„约记录
     */
    @ApiOperation("删除预约记录")
    //@PreAuthorize("@ss.hasPermi('smartor:record:remove')")
    @Log(title = "预约记录", businessType = BusinessType.DELETE)
    @GetMapping("/remove/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids) {
        return toAjax(serviceAppointRecordService.deleteServiceAppointRecordByIds(ids));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceOutPathController.java
@@ -142,6 +142,17 @@
        return toAjax(serviceOutPathService.insertServiceOutPath(serviceOutPath));
    }
    /**
     * æ–°å¢žä¸»é”®
     */
    @ApiOperation("新增主键")
    @Log(title = "主键", businessType = BusinessType.INSERT)
    @PostMapping("/addOutPath")
    public AjaxResult addOutPath(@RequestBody ServiceOutPath serviceOutPath) {
        return success(serviceOutPathService.addOutPath(serviceOutPath));
    }
    /**
     * ä¿®æ”¹ä¸»é”®
     */
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskAnswerController.java
@@ -164,8 +164,8 @@
    @PostMapping("/getQuestionCache")
    public AjaxResult getQuestionCache(@RequestBody ServiceSubTaskCacheReq serviceSubTaskCacheReq) {
        log.info("【saveQuestionCache-----getQuestionCache】的入参为:{}", serviceSubTaskCacheReq);
        if (StringUtils.isEmpty(serviceSubTaskCacheReq.getParam1()) || StringUtils.isEmpty(serviceSubTaskCacheReq.getParam2()))
            throw new BaseException("请检查param1或param2的值");
//        if (StringUtils.isEmpty(serviceSubTaskCacheReq.getParam1()) || StringUtils.isEmpty(serviceSubTaskCacheReq.getParam2()))
//            throw new BaseException("请检查param1或param2的值");
        return AjaxResult.success(serviceSubtaskAnswerService.getQuestionCache(serviceSubTaskCacheReq, 0L));
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -1,11 +1,7 @@
package com.ruoyi.web.controller.smartor;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.ISelect;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.ruoyi.common.annotation.AddOrgId;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.HttpStatus;
@@ -16,9 +12,7 @@
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.dx.MessageSend;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.enums.MsgLSEnum;
import com.ruoyi.common.enums.PreachFormEnum;
import com.ruoyi.common.enums.SendStateEnum;
import com.ruoyi.common.exception.base.BaseException;
@@ -27,11 +21,8 @@
import com.ruoyi.common.utils.reflect.ReflectUtils;
import com.ruoyi.quartz.service.ICollectHISService;
import com.ruoyi.quartz.task.RyTask;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserDeptService;
import com.smartor.common.LSHospTokenUtil;
import com.smartor.common.QwenLLMUtil;
import com.smartor.domain.*;
import com.smartor.domain.VO.HeLibraryCountVO;
import com.smartor.domain.VO.ServiceSubtaskCotinueCountVO;
@@ -53,8 +44,6 @@
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -111,7 +100,6 @@
    @ApiOperation("查询患者随访信息")
    @PostMapping("/patItem")
    public Map<String, Object> patItem(@RequestBody ServiceSubtaskVO serviceSubtaskVO) {
        serviceSubtaskVO.setPageNum(PageUtils.getOffset(serviceSubtaskVO.getPageNum(), serviceSubtaskVO.getPageSize()));
        List<ServiceSubtaskRes> serviceSubtaskList = null;
        LoginUser loginUser = getLoginUser();
@@ -189,6 +177,15 @@
        if (ObjectUtils.isNotEmpty(loginUser) && ObjectUtils.isNotEmpty(loginUser.getUser())) {
            userId = loginUser.getUser().getUserId();
        }
        if (serviceSubtaskEntity.getSendstateView() != null) {
            //            1:待随访(1 è¢«é¢†å–、2 å¾…发送、3 å·²å‘送、5 å‘送失败、7、超时);2:已完成( 6 å·²å®Œæˆï¼‰ã€3:无需随访(4 ä¸æ‰§è¡Œï¼‰
            if (serviceSubtaskEntity.getSendstateView() == 1)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L, 3L, 5L, 7L)));
            if (serviceSubtaskEntity.getSendstateView() == 2)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(6L)));
            if (serviceSubtaskEntity.getSendstateView() == 3)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(4L)));
        }
        if (ObjectUtils.isNotEmpty(userId)) {
            Map<String, Object> redisMap = redisCache.getCacheObject(userId + "patItemCount");
            Boolean redisFlag = false;
@@ -258,14 +255,13 @@
            //获取serviceSubtaskList中的所有taskid
            List<Long> taskIds = serviceSubtaskList.stream().map(ServiceSubtaskRes::getTaskid).filter(ObjectUtils::isNotEmpty).distinct().collect(Collectors.toList());
            serviceSubtaskDetailRatioExports = serviceSubtaskService.statQuestionOption(taskIds);
            serviceSubtaskDetailRatioExports = serviceSubtaskService.statQuestionOption(taskIds, serviceSubtaskVO.getStartOutHospTime(), serviceSubtaskVO.getEndOutHospTime());
        }
        ExcelUtil<ServiceSubtaskExport> util = new ExcelUtil<ServiceSubtaskExport>(ServiceSubtaskExport.class);
        util.exportExcelTwoSheet(response, serviceSubtaskExports, "患者随访信息表单",
                serviceSubtaskDetailRatioExports, "问题详情占比", ServiceSubtaskDetailRatioExport.class);
        util.exportExcelTwoSheet(response, serviceSubtaskExports, "患者随访信息表单", serviceSubtaskDetailRatioExports, "问题详情占比", ServiceSubtaskDetailRatioExport.class);
    }
    /**
@@ -573,15 +569,29 @@
                if (statisticaltype == 1) {
                    if (CollectionUtils.isEmpty(serviceSubtaskCountReq.getLeavehospitaldistrictcodes())) {
                        //全部病区
                        String deptInfo = user.getDeptInfo();
                        List<String> leavehospitaldistrictcodes = JSON.parseArray(deptInfo).stream().map(item -> (String) ((List<?>) item).get(0)).collect(Collectors.toList());
                        List<String> leavehospitaldistrictcodes = null;
                        SysUserDept sysUserWard = new SysUserDept();
                        sysUserWard.setUserId(user.getUserId());
                        sysUserWard.setOrgid(user.getOrgid());
                        sysUserWard.setDeptType("2");
                        List<SysUserDept> wardList = sysUserDeptService.selectSysUserDeptList(sysUserWard);
                        if(CollectionUtils.isNotEmpty(wardList)) {
                            leavehospitaldistrictcodes = wardList.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
                        }
                        serviceSubtaskCountReq.setLeavehospitaldistrictcodes(leavehospitaldistrictcodes);
                    }
                } else if (statisticaltype == 2) {
                    if (CollectionUtils.isEmpty(serviceSubtaskCountReq.getDeptcodes())) {
                        //全部科室
                        String hospInfo = user.getHospInfo();
                        List<String> deptCodes = JSON.parseArray(hospInfo).stream().map(item -> (String) ((List<?>) item).get(0)).collect(Collectors.toList());
                        List<String> deptCodes = null;
                        SysUserDept sysUserDept = new SysUserDept();
                        sysUserDept.setUserId(user.getUserId());
                        sysUserDept.setOrgid(user.getOrgid());
                        sysUserDept.setDeptType("1");
                        List<SysUserDept> deptList = sysUserDeptService.selectSysUserDeptList(sysUserDept);
                        if(CollectionUtils.isNotEmpty(deptList)){
                            deptCodes = deptList.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
                        }
                        serviceSubtaskCountReq.setDeptcodes(deptCodes);
                    }
                }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskController.java
@@ -222,14 +222,15 @@
        log.info("getScriptInfoByCondition入参为:{}", serviceTaskScriptQues);
        try {
            tid = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceTaskScriptQues.getParam1(), pri_key));
            pid = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceTaskScriptQues.getParam2(), pri_key));
            if (StringUtils.isNotEmpty(serviceTaskScriptQues.getParam2()))
                pid = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceTaskScriptQues.getParam2(), pri_key));
        } catch (Exception e) {
            log.error("getScriptInfoByCondition报错了:{}", e.getMessage());
        }
        log.info("tid和pid的值为:{},{}", tid, pid);
        if (StringUtils.isEmpty(serviceTaskScriptQues.getPatfrom())) serviceTaskScriptQues.setPatfrom("0");
        return success(serviceTaskService.getScriptInfoByCondition(tid, pid, true, serviceTaskScriptQues.getPatfrom(),null));
        return success(serviceTaskService.getScriptInfoByCondition(tid, pid, true, serviceTaskScriptQues.getPatfrom(), null));
    }
@@ -253,7 +254,7 @@
        log.info("tid和pid的值为:{},{}", tid, pid);
        if (StringUtils.isEmpty(serviceTaskScriptQues.getPatfrom())) serviceTaskScriptQues.setPatfrom("0");
        return success(serviceTaskService.getScriptInfoByCondition(tid, pid, true, serviceTaskScriptQues.getPatfrom(),null));
        return success(serviceTaskService.getScriptInfoByCondition(tid, pid, true, serviceTaskScriptQues.getPatfrom(), null));
    }
ruoyi-common/src/main/java/com/ruoyi/common/utils/HttpUtil.java
@@ -95,7 +95,7 @@
        return httpClient;
    }
    public static String postJsonRequest(String url, String request) throws HttpRequestException {
    public static Boolean postJsonRequest(String url, String request) throws HttpRequestException {
        Assert.hasLength(url, "请求url不能为空字符串。");
        EntityEnclosingMethod httpMethod = new PostMethod(url);
@@ -122,7 +122,7 @@
            if (inputStream == null) {
                throw new HttpRequestException(RESPONSE_NULL_ERROR_CODE, "响应为null");
            }
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,charset));
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset));
            StringBuffer stringBuffer = new StringBuffer();
            String str = "";
            while ((str = reader.readLine()) != null) {
@@ -132,7 +132,7 @@
            String respJson = stringBuffer.toString();
            // String respJson = httpMethod.getResponseBodyAsString();
            if (resultCode == OK) {
                return respJson;
                return true;
            } else {
                throw new HttpRequestException(resultCode, respJson);
            }
@@ -153,8 +153,6 @@
     * json的post请求
     *
     * @param url           è¯·æ±‚url
     * @param reqEntity     è¯·æ±‚头与请求体的封装
     * @param respBodyClass å“åº”体类型
     * @return è¿”回的响应结果
     */
    public static String postXmlRequest(String url, String request) throws HttpRequestException {
ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java
@@ -108,10 +108,11 @@
     * @param param è¯·æ±‚参数,请求参数应该是 name1=value1&name2=value2 çš„形式。
     * @return æ‰€ä»£è¡¨è¿œç¨‹èµ„源的响应结果
     */
    public static String sendPost(String url, String param) {
    public static Boolean sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        StringBuilder result = new StringBuilder();
        boolean success = false;
        try {
            log.info("sendPost - {}", url);
            URL realUrl = new URL(url);
@@ -135,6 +136,7 @@
                result.append(line);
            }
            log.info("recv - {}", result);
            success = true;
        } catch (ConnectException e) {
            log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
        } catch (SocketTimeoutException e) {
@@ -155,7 +157,7 @@
                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
            }
        }
        return result.toString();
        return success;
    }
    public static String sendPostByHeaderOld(String url, String param, Map<String, String> headers) {
ruoyi-common/src/main/java/com/ruoyi/common/utils/sms/smsUtils.java
@@ -39,8 +39,8 @@
                "\"timestamp\": " + timestamp + "," +
                "\"sign\": \"" + sign + "\"" +
                "}";
        String sendMsg=HttpUtil.postJsonRequest(url, jsonMsg);
        return sendMsg;
        Boolean sendMsg=HttpUtil.postJsonRequest(url, jsonMsg);
        return sendMsg.toString();
    }
@@ -66,8 +66,8 @@
                "\"timestamp\": " + timestamp + "," +
                "\"sign\": \"" + sign + "\"" +
                "}";
        String sendMsg=HttpUtil.postJsonRequest(url, jsonMsg);
        return sendMsg;
        Boolean sendMsg=HttpUtil.postJsonRequest(url, jsonMsg);
        return sendMsg.toString();
    }
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -12,7 +12,6 @@
import com.ruoyi.common.enums.MsgLSEnum;
import com.ruoyi.common.enums.ServiceFromEnum;
import com.ruoyi.common.enums.WxGZHEnum;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.*;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.common.utils.sms.smsUtils;
@@ -35,7 +34,6 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestParam;
import java.io.IOException;
import java.net.URLEncoder;
@@ -49,6 +47,7 @@
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static cn.hutool.core.convert.Convert.toHex;
@@ -115,6 +114,9 @@
    @Value("${xhsmsPwd}")
    private String xhsmsPwd;
    // è™šæ‹ŸæŽ¥å…¥ç 
    @Value("${xhsmsjrm}")
    private String xhsmsjrm;
    @Value("${pub_key}")
    private String pub_key;
@@ -238,6 +240,15 @@
        serviceSubtaskAnswerService.saveQuestionAnswer(null, 0L);
    }
    /**
     * èŽ·å–é¢„çº¦åœè¯Šè®°å½•ä¿¡æ¯
     *
     */
    public void getAppointRecordInfo() {
        LocalDateTime tomorrowStart = LocalDate.now().plusDays(1).atStartOfDay(); // æ˜Žå¤© 00:00:00
        LocalDateTime tomorrowEnd = tomorrowStart.plusDays(1).minusSeconds(1);     // æ˜Žå¤© 23:59:59
        ixhGatherPatArchiveService.getAppointRecordInfo("2", tomorrowStart, tomorrowEnd);
    }
    /**
     * HIS数据采集
@@ -331,78 +342,159 @@
                        aBoolean = serviceSLTDHealthcareRecordService.queryHospUserInfoList(reqVO);
                    }
                    log.info("【dealHisData】省立同德“用户信息”结束采集数据:{}", aBoolean);
                    //疾病字典采集
                    iIcd10Service.queryAddIcd10();
                }
                //疾病字典采集
                iIcd10Service.queryAddIcd10();
                // çœç«‹åŒå¾·æ•°æ®é‡‡é›†
                for (Long cid : campusidList) {
                    log.info("【dealHisData】省立同德“预入院”开始采集数据,院区:{}", cid);
                    String nowTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                    ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
                    serviceSLTDInhospReqVO.setOrgId("20001001");
                    serviceSLTDInhospReqVO.setCampusId(cid);
                    serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
                    serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
                    if (active.trim().equals("nhfy")) {
                        serviceSLTDInhospReqVO.setEncounterTimeStart(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        serviceSLTDInhospReqVO.setEncounterTimeEnd(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                // nhfy/sltd回溯30天分段采集判断(每段最多7天)
                boolean isBackfill = (active.trim().equals("nhfy") || active.trim().equals("sltd")) && StringUtils.isNotBlank(todayZeroStr);
                if (isBackfill) {
                    DateTimeFormatter dateFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                    LocalDate segStart = todayZero.toLocalDate().minusDays(30);
                    LocalDate segEndDate = todayZero.toLocalDate();
                    int segCount = 0;
                    while (!segStart.isAfter(segEndDate)) {
                        LocalDate segEnd = segStart.plusDays(6);
                        if (segEnd.isAfter(segEndDate)) {
                            segEnd = segEndDate;
                        }
                        segCount++;
                        log.info("【dealHisData】{}回溯第{}段采集,日期范围:{} ~ {}", active.trim(), segCount, segStart.format(dateFmt), segEnd.format(dateFmt));
                        for (Long cid : campusidList) {
                            collectSegmentData(cid, segStart.format(dateFmt), segEnd.format(dateFmt));
                        }
                        segStart = segEnd.plusDays(1);
                    }
                    List<String> list = new ArrayList<>();
                    list.add("FH0109.22");
                    list.add("FH0109.23");
                    list.add("FH0109.53");
                    serviceSLTDInhospReqVO.setStatusList(list);
                    log.info("【dealHisData】省立同德“预入院”采集数据入参:{}", serviceSLTDInhospReqVO);
                    serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                    log.info("【dealHisData】省立同德“预入院”結束采集数据,院区:{}", cid);
                    log.info("【dealHisData】{}回溯采集完成,共{}段", active.trim(), segCount);
                }
                    log.info("【dealHisData】省立同德“入院”开始采集数据,院区:{}", cid);
                    serviceSLTDInhospReqVO.setOrgId("20001001");
                    serviceSLTDInhospReqVO.setCampusId(cid);
                    serviceSLTDInhospReqVO.setEncounterTimeStart(null);
                    serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
                    serviceSLTDInhospReqVO.setStartHeadTime(nowTime);
                    serviceSLTDInhospReqVO.setStartTailTime(nowTime);
                    if (active.trim().equals("nhfy")) {
                        serviceSLTDInhospReqVO.setStartHeadTime(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        serviceSLTDInhospReqVO.setStartTailTime(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                    }
                    List<String> listStr = new ArrayList<>();
                    listStr.add("FH0109.24");
                    serviceSLTDInhospReqVO.setStatusList(listStr);
                    log.info("【dealHisData】省立同德“入院”采集数据入参:{}", serviceSLTDInhospReqVO);
                    serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                    log.info("【dealHisData】省立同德“入院”結束采集数据,院区:{}", cid);
                // çœç«‹åŒå¾·æ•°æ®é‡‡é›†ï¼ˆéžå›žæº¯æ¨¡å¼æ‰æ‰§è¡Œï¼‰
                if (!isBackfill) {
                    for (Long cid : campusidList) {
                        log.info("【dealHisData】省立同德预入院开始采集数据,院区:{}", cid);
                        String nowTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                        ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
                        serviceSLTDInhospReqVO.setOrgId("20001001");
                        serviceSLTDInhospReqVO.setCampusId(cid);
                        serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
                        serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
                        if (active.trim().equals("nhfy")) {
                            serviceSLTDInhospReqVO.setEncounterTimeStart(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                            serviceSLTDInhospReqVO.setEncounterTimeEnd(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        }
                        List<String> list = new ArrayList<>();
                        list.add("FH0109.22");
                        list.add("FH0109.23");
                        list.add("FH0109.53");
                        serviceSLTDInhospReqVO.setStatusList(list);
                        log.info("【dealHisData】省立同德“预入院”采集数据入参:{}", serviceSLTDInhospReqVO);
                        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                        log.info("【dealHisData】省立同德“预入院”結束采集数据,院区:{}", cid);
                    log.info("【dealHisData】省立同德“出院”开始采集数据,院区:{}", cid);
                    serviceSLTDInhospReqVO.setStartHeadTime(null);
                    serviceSLTDInhospReqVO.setStartTailTime(null);
                    serviceSLTDInhospReqVO.setEncounterTimeStart(null);
                    serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
                    serviceSLTDInhospReqVO.setPreOutHospitalHeadDate(nowTime);
                    serviceSLTDInhospReqVO.setPreOutHospitalTailDate(nowTime);
                    if (active.trim().equals("nhfy")) {
                        serviceSLTDInhospReqVO.setPreOutHospitalHeadDate(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        serviceSLTDInhospReqVO.setPreOutHospitalTailDate(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                    }
                    serviceSLTDInhospReqVO.setHealthcareRecordTypeList(null);
                    List<String> list2 = new ArrayList<>();
                        log.info("【dealHisData】省立同德“入院”开始采集数据,院区:{}", cid);
                        serviceSLTDInhospReqVO.setOrgId("20001001");
                        serviceSLTDInhospReqVO.setCampusId(cid);
                        serviceSLTDInhospReqVO.setEncounterTimeStart(null);
                        serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
                        serviceSLTDInhospReqVO.setStartHeadTime(nowTime);
                        serviceSLTDInhospReqVO.setStartTailTime(nowTime);
                        if (active.trim().equals("nhfy")) {
                            serviceSLTDInhospReqVO.setStartHeadTime(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                            serviceSLTDInhospReqVO.setStartTailTime(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        }
                        List<String> listStr = new ArrayList<>();
                        listStr.add("FH0109.24");
                        serviceSLTDInhospReqVO.setStatusList(listStr);
                        log.info("【dealHisData】省立同德“入院”采集数据入参:{}", serviceSLTDInhospReqVO);
                        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                        log.info("【dealHisData】省立同德“入院”結束采集数据,院区:{}", cid);
                        log.info("【dealHisData】省立同德“出院”开始采集数据,院区:{}", cid);
                        serviceSLTDInhospReqVO.setStartHeadTime(null);
                        serviceSLTDInhospReqVO.setStartTailTime(null);
                        serviceSLTDInhospReqVO.setEncounterTimeStart(null);
                        serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
                        serviceSLTDInhospReqVO.setPreOutHospitalHeadDate(nowTime);
                        serviceSLTDInhospReqVO.setPreOutHospitalTailDate(nowTime);
                        if (active.trim().equals("nhfy")) {
                            serviceSLTDInhospReqVO.setPreOutHospitalHeadDate(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                            serviceSLTDInhospReqVO.setPreOutHospitalTailDate(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        }
                        serviceSLTDInhospReqVO.setHealthcareRecordTypeList(null);
                        List<String> list2 = new ArrayList<>();
//                    list2.add("FH0108.02");
                    //出院
                    list2.add("FH0109.27");
                    //预出院
                    list2.add("FH0109.25");
                    serviceSLTDInhospReqVO.setStatusList(list2);
                    log.info("【dealHisData】省立同德“出院”采集数据入参:{}", serviceSLTDInhospReqVO);
                    serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                    log.info("【dealHisData】省立同德“出院”束采集数据,院区:{}", cid);
                        //出院
                        list2.add("FH0109.27");
                        //预出院
                        list2.add("FH0109.25");
                        serviceSLTDInhospReqVO.setStatusList(list2);
                        log.info("【dealHisData】省立同德“出院”采集数据入参:{}", serviceSLTDInhospReqVO);
                        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                        log.info("【dealHisData】省立同德“出院”束采集数据,院区:{}", cid);
                    }
                }
            } catch (Exception e) {
                log.error("【dealHisData】省立同德数据采集异常", e);
            }
        }
    }
    /**
     * åˆ†æ®µé‡‡é›†æ•°æ®ï¼ˆé¢„入院、入院、出院)
     * ç”¨äºŽnhfy/sltd回溯采集,每次最多查询7天数据
     *
     * @param cid          é™¢åŒºID
     * @param startDateStr æ—¥æœŸå¼€å§‹ yyyy-MM-dd
     * @param endDateStr   æ—¥æœŸç»“束 yyyy-MM-dd
     */
    private void collectSegmentData(Long cid, String startDateStr, String endDateStr) {
        // é¢„入院
        log.info("【dealHisData】预入院开始采集数据,院区:{},时间段:{} ~ {}", cid, startDateStr, endDateStr);
        ServiceSLTDInhospReqVO reqVO = new ServiceSLTDInhospReqVO();
        reqVO.setOrgId("20001001");
        reqVO.setCampusId(cid);
        reqVO.setEncounterTimeStart(startDateStr);
        reqVO.setEncounterTimeEnd(endDateStr);
        List<String> preAdmitStatus = new ArrayList<>();
        preAdmitStatus.add("FH0109.22");
        preAdmitStatus.add("FH0109.23");
        preAdmitStatus.add("FH0109.53");
        reqVO.setStatusList(preAdmitStatus);
        log.info("【dealHisData】预入院采集数据入参:{}", reqVO);
        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
        log.info("【dealHisData】预入院終了采集数据,院区:{}", cid);
        // å…¥é™¢
        log.info("【dealHisData】入院开始采集数据,院区:{},时间段:{} ~ {}", cid, startDateStr, endDateStr);
        reqVO = new ServiceSLTDInhospReqVO();
        reqVO.setOrgId("20001001");
        reqVO.setCampusId(cid);
        reqVO.setStartHeadTime(startDateStr);
        reqVO.setStartTailTime(endDateStr);
        List<String> admitStatus = new ArrayList<>();
        admitStatus.add("FH0109.24");
        reqVO.setStatusList(admitStatus);
        log.info("【dealHisData】入院采集数据入参:{}", reqVO);
        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
        log.info("【dealHisData】入院終了采集数据,院区:{}", cid);
        // å‡ºé™¢
        log.info("【dealHisData】出院开始采集数据,院区:{},时间段:{} ~ {}", cid, startDateStr, endDateStr);
        reqVO = new ServiceSLTDInhospReqVO();
        reqVO.setOrgId("20001001");
        reqVO.setCampusId(cid);
        reqVO.setPreOutHospitalHeadDate(startDateStr);
        reqVO.setPreOutHospitalTailDate(endDateStr);
        List<String> dischargeStatus = new ArrayList<>();
        //出院
        dischargeStatus.add("FH0109.27");
        //预出院
        dischargeStatus.add("FH0109.25");
        reqVO.setStatusList(dischargeStatus);
        log.info("【dealHisData】出院采集数据入参:{}", reqVO);
        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
        log.info("【dealHisData】出院结束采集数据,院区:{}", cid);
    }
    /**
@@ -418,7 +510,7 @@
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            todayZero = LocalDateTime.parse(todayZeroStr, formatter);
        }
        LocalDateTime yesterdayZero = todayZero.minusDays(1);
        LocalDateTime tomorrowdayZero = todayZero.plusDays(1);
        if (active.trim().equals("sltd") || active.trim().equals("nhfy")) {
            //省立同德与华南附一用同一套采集方法(都是来未来提供)
@@ -439,6 +531,7 @@
                }
                // çœç«‹åŒå¾·æ•°æ®é‡‡é›†
                log.info("--campusidList的值为:{}", campusidList);
                for (Long cid : campusidList) {
                    String nowTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                    ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
@@ -447,24 +540,26 @@
                    serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
                    serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
                    // é—¨æ€¥è¯Šåˆ†é¡µé‡‡é›†ï¼šæ¯é¡µ1000条,直到无数据为止(南华附一的先不采门急诊数据)
                    // é—¨æ€¥è¯Šåˆ†é¡µé‡‡é›†ï¼šæ¯é¡µ40条,直到无数据为止(南华附一的先不采门急诊数据)
                    if (active.trim().equals("sltd")) {
                        log.info("【dealHisData】省立同德“门急诊”开始分页采集数据,院区:{}", cid);
                        serviceSLTDInhospReqVO.setStartHeadTime(null);
                        serviceSLTDInhospReqVO.setStartTailTime(null);
//                        serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
//                        serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
//                        if (yesterdayZero != null) {
                        serviceSLTDInhospReqVO.setEncounterTimeStart(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        serviceSLTDInhospReqVO.setEncounterTimeEnd(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
//                        }
                        //查询当天的数据
                        serviceSLTDInhospReqVO.setEncounterTimeEnd(tomorrowdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        serviceSLTDInhospReqVO.setEncounterTimeStart(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        serviceSLTDInhospReqVO.setStatusList(null);
                        List<String> list1 = new ArrayList<>();
                        list1.add("FH0108.01");
                        list1.add("FH0108.03");
                        serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list1);
                        long outpPage = 1L;
                        final long OUTP_PAGE_SIZE = 1000L;
                        //从缓存里获取起始页(零点前10分钟内用昨天的日期,避免跨天漏采)
                        LocalDateTime now = LocalDateTime.now();
                        String mzCacheDate = (now.getHour() == 0 && now.getMinute() < 10) ? now.minusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) : now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                        Long outpPage = redisCache.getCacheObject("mzCurrent" + cid + mzCacheDate);
                        if (outpPage == null) outpPage = 1L;
                        //那边暂时只能设置40
                        final long OUTP_PAGE_SIZE = 500L;
                        while (true) {
                            serviceSLTDInhospReqVO.setCurrent(outpPage);
                            serviceSLTDInhospReqVO.setSize(OUTP_PAGE_SIZE);
@@ -476,6 +571,9 @@
                            }
                            log.info("【dealHisData】省立同德“门急诊”第{}页采集{}条,院区:{}", outpPage, outpResult.size(), cid);
                            if (outpResult.size() < OUTP_PAGE_SIZE) {
                                //设置一个缓存,用来存在下次的起始页
                                redisCache.setCacheObject("mzCurrent" + cid + mzCacheDate, outpPage, 24, TimeUnit.HOURS);
                                log.info("【dealHisData】省立同德“门急诊”的缓存key:{}下次的起始页{},院区:{}", "mzCurrent" + cid + mzCacheDate, outpPage, cid);
                                break;
                            }
                            outpPage++;
@@ -491,6 +589,26 @@
            }
        }
    }
    /**
     * åŒå¾·è¯å“æ•°æ®é‡‡é›†
     */
    public void dealHisDataMedication() {
        final long OUTP_PAGE_SIZE = 500L;
        ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
        serviceSLTDInhospReqVO.setOrgId("20001001");
        Long outpPage = 1L;
        while (true) {
            serviceSLTDInhospReqVO.setCurrent(outpPage);
            serviceSLTDInhospReqVO.setSize(OUTP_PAGE_SIZE);
            log.info("【dealHisData】省立同德“药品数据”采集第{}页数据", outpPage);
           Boolean b = serviceSLTDHealthcareRecordService.queryMedicationItemList(serviceSLTDInhospReqVO);
            log.info("【dealHisData】省立同德“药品数据”采集结果:{}", b);
            outpPage++;
        }
    }
    public void dealHisDataSLTD() {
        log.info("【dealHisData】开始执行HIS数据采集任务");
@@ -932,9 +1050,9 @@
                        SysConfig sysConfig = new SysConfig();
                        if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("6")) {
                            sysConfig = sysConfigMapper.checkConfigKeyUnique("zymyd.sms.template");
                        }else if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("14")) {
                        } else if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("14")) {
                            sysConfig = sysConfigMapper.checkConfigKeyUnique("mzmyd.sms.template");
                        }else {
                        } else {
                            sysConfig = sysConfigMapper.checkConfigKeyUnique("wj.sms.template");
                        }
                        if (!Objects.isNull(sysConfig)) {
@@ -968,9 +1086,29 @@
                    log.info("active的值为:{}", active);
                    if (active.equals("xh")) {
                        Map<String, String> req = new HashMap<>();
                        req.put("phone", sendMagParam.getPhone());
                        req.put("content", sendMagParam.getContent());
                        isSuccess = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(req));
//                        req.put("phone", sendMagParam.getPhone());
//                        req.put("content", sendMagParam.getContent());
                        Map<String, String> map2 = new HashMap<String, String>();
                        map2.put("action", "send");
                        map2.put("account", xhsmsAccount);
                        map2.put("password", xhsmsPwd);
                        map2.put("mobile", sendMagParam.getPhone());
                        map2.put("content", sendMagParam.getContent());
                        map2.put("extno", xhsmsjrm);
                        map2.put("rt", "json");
                        StringBuilder encodedParams = new StringBuilder();
                        for (Map.Entry<String, String> entry : map2.entrySet()) {
                            if (encodedParams.length() > 0) {
                                encodedParams.append("&");
                            }
                            // å¯¹é”®å’Œå€¼è¿›è¡ŒURL编码
                            String encodedKey = URLEncoder.encode(entry.getKey(), "UTF-8");
                            String encodedValue = URLEncoder.encode(entry.getValue(), "UTF-8");
                            encodedParams.append(encodedKey).append("=").append(encodedValue);
                        }
                        Boolean result = HttpUtils.sendPost(xhsmsPath, new Gson().toJson(req));
                        if (result) isSuccess = "true";
                    } else if (active.equals("ls")) {
//                        String url = configService.selectConfigByKey("token.360", serviceSubtask.getOrgid());
//                        //丽水的短信发送方式
@@ -1514,7 +1652,7 @@
        return serviceTaskMap;
    }
    public int qwenLLMTest(String questionText, String voiceText,String value,String regexText) {
    public int qwenLLMTest(String questionText, String voiceText, String value, String regexText) {
        int result = QwenLLMUtil.matchRegex(questionText, voiceText, value, regexText);
        return result;
    }
ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml
@@ -221,6 +221,7 @@
        <result property="futypedesc" column="futypedesc"/>
        <result property="fuadvice" column="fuadvice"/>
        <result property="fuspecialadvice" column="fuspecialadvice"/>
        <result property="inhospMydFlag" column="inhosp_myd_flag"/>
    </resultMap>
    <resultMap type="com.smartor.domain.PatMedOuthosp" id="PatMedOuthospResult">
@@ -654,6 +655,7 @@
        b.leavehospitaldistrictname,
        b.leavehospitaldistrictid,
        b.deptid,
        b.inhosp_myd_flag,
        b.leaveldeptid
        FROM
        healthy_inhosp b
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserDeptMapper.java
@@ -74,5 +74,7 @@
    public int deleteSysUserDeptByCode(SysUserDept sysUserDept);
    public int deleteSysUserDeptByUserId(SysUserDept sysUserDept);
    public int updateSysUserDeptForSync(SysUserDept sysUserDept);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -709,6 +709,12 @@
//                sysUserDeptMapper.insertSysUserDept(sysUserDep);
//            }
//        }
        //删除原有关系
        SysUserDept delSysUserDept = new SysUserDept();
        delSysUserDept.setUserId(user.getUserId());
        delSysUserDept.setOrgid(user.getOrgid());
        sysUserDeptMapper.deleteSysUserDeptByUserId(delSysUserDept);
        if (!CollectionUtils.isEmpty(user.getDeptCodes())) {
            for (String deptCode : user.getDeptCodes()) {
                SysDept sysDept = sysDeptMapper.selectDeptByCode("1", user.getOrgid(), deptCode);
@@ -721,20 +727,15 @@
                sysUserDept.setOrgid(user.getOrgid());
                sysUserDept.setDeptCode(deptCode);
                sysUserDept.setDeptId(sysDept.getDeptId());
                List<SysUserDept> sysUserDepts = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
                sysUserDept.setDelFlag(0L);
                sysUserDept.setDeptType("1");
                sysUserDept.setDeptName(sysDept.getDeptName());
                sysUserDept.setUpdateTime(new Date());
                if (!CollectionUtils.isEmpty(sysUserDepts)) {
                    sysUserDept.setId(sysUserDepts.get(0).getId());
                    sysUserDeptMapper.updateSysUserDept(sysUserDept);
                    continue;
                }
                sysUserDept.setCreateTime(new Date());
                sysUserDeptMapper.insertSysUserDept(sysUserDept);
            }
        }
        if (!CollectionUtils.isEmpty(user.getWardCodes())) {
            for (String wardCode : user.getWardCodes()) {
                SysDept sysDept = sysDeptMapper.selectDeptByCode("2", user.getOrgid(), wardCode);
@@ -746,16 +747,11 @@
                sysUserDept.setDeptCode(wardCode);
                sysUserDept.setDeptId(sysDept.getDeptId());
                sysUserDept.setOrgid(user.getOrgid());
                List<SysUserDept> sysUserDepts = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
                sysUserDept.setDelFlag(0L);
                sysUserDept.setDeptType("2");
                sysUserDept.setOrgid(user.getOrgid());
                sysUserDept.setDeptName(sysDept.getDeptName());
                sysUserDept.setUpdateTime(new Date());
                if (!CollectionUtils.isEmpty(sysUserDepts)) {
                    sysUserDeptMapper.updateSysUserDept(sysUserDept);
                    continue;
                }
                sysUserDept.setCreateTime(new Date());
                sysUserDeptMapper.insertSysUserDept(sysUserDept);
            }
ruoyi-system/src/main/resources/mapper/system/SysUserDeptMapper.xml
@@ -237,6 +237,24 @@
        where user_id =#{userId} and dept_code=#{deptCode}
    </update>
    <update id="deleteSysUserDeptByUserId" parameterType="String">
        update sys_user_dept
        <trim prefix="SET" suffixOverrides=",">
            del_flag =1,
            update_time = sysdate()
        </trim>
        where del_flag = 0
        <if test="userId != null">
            and user_id =#{userId}
        </if>
        <if test="orgid != null ">
            and orgid = #{orgid}
        </if>
        <if test="deptType != null ">
            and dept_type = #{deptType}
        </if>
    </update>
    <update id="updateSysUserDeptForSync" parameterType="com.ruoyi.common.core.domain.entity.SysUserDept">
        update sys_user_dept
        <trim prefix="SET" suffixOverrides=",">
smartor/src/main/java/com/smartor/domain/MedicationDoseInfo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.smartor.domain;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * è¯å“å‰‚量信息对象 medication_dose_info
 *
 * @author lihu
 * @date 2026-07-17
 */
@Data
@ApiModel("药品剂量信息")
public class MedicationDoseInfo extends BaseEntity
        {
private static final long serialVersionUID = 1L;
    /** ä¸»é”®ID */
    @ApiModelProperty("主键ID")
        //数据库自增改成@TableId(type = IdType.AUTO)
    private Long id;
    /** è¯å“ID(关联medication_item.id) */
    @ApiModelProperty("药品ID(关联medication_item.id)")
     @Excel(name = "药品ID", readConverterExp = "关=联medication_item.id")
    private Long medicationItemId;
    /** å‰‚量小包装转换比 */
    @ApiModelProperty("剂量小包装转换比")
     @Excel(name = "剂量小包装转换比")
    private BigDecimal doseSmallPackageRation;
    /** å‰‚量 */
    @ApiModelProperty("剂量")
     @Excel(name = "剂量")
    private Long dose;
    /** å‰‚量小包装数量 */
    @ApiModelProperty("剂量小包装数量")
     @Excel(name = "剂量小包装数量")
    private Long doseSmallPackageNum;
    /** å‰‚量单位 */
    @ApiModelProperty("剂量单位")
     @Excel(name = "剂量单位")
    private String doseUnit;
    /** å‰‚量单位类型 */
    @ApiModelProperty("剂量单位类型")
     @Excel(name = "剂量单位类型")
    private Long doseUnitType;
        }
smartor/src/main/java/com/smartor/domain/MedicationItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,168 @@
package com.smartor.domain;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * è¯å“ä¿¡æ¯å¯¹è±¡ medication_item
 *
 * @author lihu
 * @date 2026-07-17
 */
@Data
@ApiModel("药品信息")
public class MedicationItem extends BaseEntity
        {
private static final long serialVersionUID = 1L;
    /** ä¸»é”®ID */
    @ApiModelProperty("主键ID")
        //数据库自增改成@TableId(type = IdType.AUTO)
    private Long id;
    /** è¯å“è¯†åˆ«ç  */
    @ApiModelProperty("药品识别码")
     @Excel(name = "药品识别码")
    private String identificationCode;
    /** äº”笔码 */
    @ApiModelProperty("五笔码")
     @Excel(name = "五笔码")
    private String wbm;
    /** è¯å“é€šç”¨å */
    @ApiModelProperty("药品通用名")
     @Excel(name = "药品通用名")
    private String medicationCommonName;
    /** ç”Ÿäº§åŽ‚å®¶åç§° */
    @ApiModelProperty("生产厂家名称")
     @Excel(name = "生产厂家名称")
    private String manufacturerName;
    /** è¯å“ç¼–码 */
    @ApiModelProperty("药品编码")
     @Excel(name = "药品编码")
    private String itemCode;
    /** å¤§å°åŒ…装转换比 */
    @ApiModelProperty("大小包装转换比")
     @Excel(name = "大小包装转换比")
    private Long smallLargePackageRatio;
    /** æœºæž„ID */
    @ApiModelProperty("机构ID")
     @Excel(name = "机构ID")
    private Long orgId;
    /** è¯å“åç§° */
    @ApiModelProperty("药品名称")
     @Excel(name = "药品名称")
    private String itemName;
    /** è¯å“ç±»åž‹ */
    @ApiModelProperty("药品类型")
     @Excel(name = "药品类型")
    private String medicationType;
    /** æŠ—菌药物等级编码 */
    @ApiModelProperty("抗菌药物等级编码")
     @Excel(name = "抗菌药物等级编码")
    private String antimicrobialGradeCode;
    /** æ‰¹å‡†æ–‡å· */
    @ApiModelProperty("批准文号")
     @Excel(name = "批准文号")
    private String licenseNumber;
    /** é»˜è®¤ç”¨æ³•名称 */
    @ApiModelProperty("默认用法名称")
     @Excel(name = "默认用法名称")
    private String defaultUsageName;
    /** ç‰¹æ®Šè¯å“åç§° */
    @ApiModelProperty("特殊药品名称")
     @Excel(name = "特殊药品名称")
    private String specialDrugsName;
    /** æŠ—菌药物等级名称 */
    @ApiModelProperty("抗菌药物等级名称")
     @Excel(name = "抗菌药物等级名称")
    private String antimicrobialGradeName;
    /** é€šç”¨åæ‹¼éŸ³ */
    @ApiModelProperty("通用名拼音")
     @Excel(name = "通用名拼音")
    private String commonPinyin;
    /** é€šç”¨åäº”笔码 */
    @ApiModelProperty("通用名五笔码")
     @Excel(name = "通用名五笔码")
    private String commonWbm;
    /** ç”Ÿäº§åނ家ID */
    @ApiModelProperty("生产厂家ID")
     @Excel(name = "生产厂家ID")
    private Long manufacturerId;
    /** é»˜è®¤ç”¨æ³•ID */
    @ApiModelProperty("默认用法ID")
     @Excel(name = "默认用法ID")
    private Long defaultUsageId;
    /** è§„æ ¼ */
    @ApiModelProperty("规格")
     @Excel(name = "规格")
    private String specification;
    /** å°åŒ…装单位 */
    @ApiModelProperty("小包装单位")
     @Excel(name = "小包装单位")
    private String smallPackageUnit;
    /** è¯å“ID(业务主键) */
    @ApiModelProperty("药品ID(业务主键)")
     @Excel(name = "药品ID", readConverterExp = "业=务主键")
    private Long itemId;
    /** ç‰¹æ®Šè¯å“ç¼–码 */
    @ApiModelProperty("特殊药品编码")
     @Excel(name = "特殊药品编码")
    private String specialDrugsCode;
    /** æ‹¼éŸ³ */
    @ApiModelProperty("拼音")
     @Excel(name = "拼音")
    private String pinyin;
    /** å‰‚型名称 */
    @ApiModelProperty("剂型名称")
     @Excel(name = "剂型名称")
    private String doseFormName;
    /** å¤§åŒ…装单位 */
    @ApiModelProperty("大包装单位")
     @Excel(name = "大包装单位")
    private String largePackageUnit;
    /** é›¶å”®ä»· */
    @ApiModelProperty("零售价")
     @Excel(name = "零售价")
    private BigDecimal retailPrice;
    /** çŠ¶æ€ */
    @ApiModelProperty("状态")
     @Excel(name = "状态")
    private Long status;
    @ApiModelProperty("剂量信息列表")
    private List<MedicationDoseInfo> doseInfoList;
        }
smartor/src/main/java/com/smartor/domain/PatMedInhosp.java
@@ -301,7 +301,7 @@
     * ç§‘室长期任务,是否处理:0未处理   1处理
     */
    @ApiModelProperty(value = "长期任务,是否处理:0未处理   1处理成功    2处理失败 ")
    private String  deptcheckFlag;
    private String deptcheckFlag;
    /**
     * ç—…区长期任务,是否处理:0未处理   1处理
     */
@@ -324,7 +324,7 @@
     * å…¥é™¢ç§‘室长期任务,是否处理:0未处理   1处理
     */
    @ApiModelProperty(value = "入院科室长期任务,是否处理:0未处理   1处理成功    2处理失败 ")
    private String  inDeptcheckFlag;
    private String inDeptcheckFlag;
    /**
     * å…¥é™¢ç—…区长期任务,是否处理:0未处理   1处理
@@ -511,4 +511,11 @@
    @ApiModelProperty("院区")
    @Excel(name = " é™¢åŒº ")
    private String campusid;
    /**
     * '满意度标识:0未做满度   1住院满度度  2出院满意度  ï¼ˆå¦‚果既要做住院,又要做出院,则用“,”分割,例如1,2)
     */
    @ApiModelProperty("'满意度标识:0未做满度   1住院满度度  2出院满意度  ï¼ˆå¦‚果既要做住院,又要做出院,则用“,”分割,例如1,2)")
    @Excel(name = " '满意度标识:0未做满度   1住院满度度  2出院满意度  ï¼ˆå¦‚果既要做住院,又要做出院,则用“,”分割,例如1,2) ")
    private String inhospMydFlag;
}
smartor/src/main/java/com/smartor/domain/ServiceAppointRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,453 @@
package com.smartor.domain;
import com.google.gson.annotations.SerializedName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * é¢„约记录对象 service_appoint_record
 *
 * @author lihu
 * @date 2026-07-06
 */
@Data
@ApiModel("预约记录")
public class ServiceAppointRecord extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®ID
     */
    @ApiModelProperty("主键ID")
    //数据库自增改成@TableId(type = IdType.AUTO)
    private Long id;
    /**
     * é¢„约记录序号
     */
    @ApiModelProperty("预约记录序号")
    @Excel(name = "预约记录序号")
    private String appointRecSn;
    /**
     * æ¢è¯Šé¢„约记录序号
     */
    @ApiModelProperty("换诊预约记录序号")
    @Excel(name = "换诊预约记录序号")
    private String changeAppointRecSn;
    /**
     * ç»„织科室代码
     */
    @ApiModelProperty("组织科室代码")
    @Excel(name = "组织科室代码")
    private String orgCode;
    /**
     * ç—…人档案序号
     */
    @ApiModelProperty("病人档案序号")
    @Excel(name = "病人档案序号")
    private String patFileSn;
    /**
     * ç—…人介质序号
     */
    @ApiModelProperty("病人介质序号")
    @Excel(name = "病人介质序号")
    private String patMediaSn;
    /**
     * ç—…人介质号码
     */
    @ApiModelProperty("病人介质号码")
    @Excel(name = "病人介质号码")
    private String patMediaNum;
    /**
     * ç—…人类别序号
     */
    @ApiModelProperty("病人类别序号")
    @Excel(name = "病人类别序号")
    private String patCateSn;
    /**
     * ç—…人性质序号
     */
    @ApiModelProperty("病人性质序号")
    @Excel(name = "病人性质序号")
    private String patNatureSn;
    /**
     * ç—…人档案姓名
     */
    @ApiModelProperty("病人档案姓名")
    @Excel(name = "病人档案姓名")
    private String patFileName;
    /**
     * ç—…人档案性别
     */
    @ApiModelProperty("病人档案性别")
    @Excel(name = "病人档案性别")
    private String patFileGender;
    /**
     * ç—…人预约年龄
     */
    @ApiModelProperty("病人预约年龄")
    @Excel(name = "病人预约年龄")
    private String patAge;
    /**
     * ç—…人出生日期
     */
    @ApiModelProperty("病人出生日期")
    @Excel(name = "病人出生日期")
    private String patBirthday;
    /**
     * ç—…人证件类型编码
     */
    @ApiModelProperty("病人证件类型编码")
    @Excel(name = "病人证件类型编码")
    private String patCardTypeCode;
    /**
     * ç—…人证件类型
     */
    @ApiModelProperty("病人证件类型")
    @Excel(name = "病人证件类型")
    private String patCardType;
    /**
     * ç—…人证件号码
     */
    @ApiModelProperty("病人证件号码")
    @Excel(name = "病人证件号码")
    private String patIdCardNum;
    /**
     * ç—…人联系地址
     */
    @ApiModelProperty("病人联系地址")
    @Excel(name = "病人联系地址")
    private String patAddr;
    /**
     * ç—…人联系电话
     */
    @ApiModelProperty("病人联系电话")
    @Excel(name = "病人联系电话")
    private String patTel;
    /**
     * ç—…人来源编码
     */
    @ApiModelProperty("病人来源编码")
    @Excel(name = "病人来源编码")
    private String patWayCode;
    /**
     * ç—…人来源
     */
    @ApiModelProperty("病人来源")
    @Excel(name = "病人来源")
    private String patWay;
    /**
     * é¢„约类型序号
     */
    @ApiModelProperty("预约类型序号")
    @Excel(name = "预约类型序号")
    private String appointTypeSn;
    /**
     * é¢„约操作日期
     */
    @ApiModelProperty("预约操作日期")
    @Excel(name = "预约操作日期")
    private Date appointDate;
    /**
     * é¢„约操作人id
     */
    @ApiModelProperty("预约操作人id")
    @Excel(name = "预约操作人id")
    private String appointOperatorId;
    /**
     * é¢„约操作人姓名
     */
    @ApiModelProperty("预约操作人姓名")
    @Excel(name = "预约操作人姓名")
    private String appointOperatorName;
    /**
     * é¢„约挂号日期
     */
    @ApiModelProperty("预约挂号日期")
    @Excel(name = "预约挂号日期")
    private Date appointRegistDate;
    /**
     * æŒ‚号排班序号
     */
    @ApiModelProperty("挂号排班序号")
    @Excel(name = "挂号排班序号")
    private String registerScheduleSn;
    /**
     * é—¨è¯Šç±»åˆ«åºå·
     */
    @ApiModelProperty("门诊类别序号")
    @Excel(name = "门诊类别序号")
    private String outpatCateSn;
    /**
     * é—¨è¯Šç±»åˆ«åç§°
     */
    @ApiModelProperty("门诊类别名称")
    @Excel(name = "门诊类别名称")
    private String outpatCateName;
    /**
     * æŒ‚号科室编码
     */
    @ApiModelProperty("挂号科室编码")
    @Excel(name = "挂号科室编码")
    private String registDeptCode;
    /**
     * æŒ‚号科室名称
     */
    @ApiModelProperty("挂号科室名称")
    @Excel(name = "挂号科室名称")
    private String registDeptName;
    /**
     * ç§‘室拼音编码
     */
    @ApiModelProperty("科室拼音编码")
    @Excel(name = "科室拼音编码")
    private String deptPinyinCode;
    /**
     * æŒ‚号医生代码
     */
    @ApiModelProperty("挂号医生代码")
    @Excel(name = "挂号医生代码")
    private String registDoctCode;
    /**
     * æŒ‚号医生姓名
     */
    @ApiModelProperty("挂号医生姓名")
    @Excel(name = "挂号医生姓名")
    private String registDoctName;
    /**
     * èŒå·¥æ‹¼éŸ³ç¼–码
     */
    @ApiModelProperty("职工拼音编码")
    @Excel(name = "职工拼音编码")
    private String staffPinyinCode;
    /**
     * æŒ‚号时间类别
     */
    @ApiModelProperty("挂号时间类别")
    @Excel(name = "挂号时间类别")
    private Long registTimeCate;
    /**
     * ç—…人挂号序号
     */
    @ApiModelProperty("病人挂号序号")
    @Excel(name = "病人挂号序号")
    private Long patiRegistSn;
    /**
     * é¢„约挂号费用
     */
    @ApiModelProperty("预约挂号费用")
    @Excel(name = "预约挂号费用")
    private BigDecimal scheduleRegistCharge;
    /**
     * æŒ‚号记录序号
     */
    @ApiModelProperty("挂号记录序号")
    @Excel(name = "挂号记录序号")
    private String registRecSn;
    /**
     * ç™»è®°ç”¨æˆ·åºå·
     */
    @ApiModelProperty("登记用户序号")
    @Excel(name = "登记用户序号")
    private String regUserSn;
    /**
     * ç™»è®°ç”¨æˆ·å§“名
     */
    @ApiModelProperty("登记用户姓名")
    @Excel(name = "登记用户姓名")
    private String regUserName;
    /**
     * ç™»è®°æ“ä½œæ—¶é—´
     */
    @ApiModelProperty("登记操作时间")
    @Excel(name = "登记操作时间")
    private Date regOptTime;
    /**
     * æ’¤é”€ç”¨æˆ·åºå·
     */
    @ApiModelProperty("撤销用户序号")
    @Excel(name = "撤销用户序号")
    private String revokeUserSn;
    /**
     * æ’¤é”€äººå§“名
     */
    @ApiModelProperty("撤销人姓名")
    @Excel(name = "撤销人姓名")
    private String revokeUserName;
    /**
     * æ’¤é”€æ“ä½œæ—¶é—´
     */
    @ApiModelProperty("撤销操作时间")
    @Excel(name = "撤销操作时间")
    private Date revokeOptTime;
    /**
     * é€€å·æ—¶é—´
     */
    @ApiModelProperty("退号时间")
    @Excel(name = "退号时间")
    private Date withdrawalTime;
    /**
     * é¢„约状态标志(0:已预约 1:已挂号 2:已退号 3:已就诊 -1:病人取消 -2:医院取消 -3:排班停诊)
     */
    @ApiModelProperty("预约状态标志(0:已预约 1:已挂号 2:已退号 3:已就诊 -1:病人取消 -2:医院取消 -3:排班停诊)")
    @Excel(name = "预约状态标志(0:已预约 1:已挂号 2:已退号 3:已就诊 -1:病人取消 -2:医院取消 -3:排班停诊)")
    private Long scheduleStatusFlag;
    /**
     * é¢„约备注说明
     */
    @ApiModelProperty("预约备注说明")
    @Excel(name = "预约备注说明")
    private String scheduleMemoDesc;
    /**
     * é¢„约凭证号码
     */
    @ApiModelProperty("预约凭证号码")
    @Excel(name = "预约凭证号码")
    private String scheduleCredenceNum;
    /**
     * é¢„计就诊时间
     */
    @ApiModelProperty("预计就诊时间")
    @Excel(name = "预计就诊时间")
    private String registTimeRange;
    /**
     * å…·ä½“明细表明细序号
     */
    @ApiModelProperty("具体明细表明细序号")
    @Excel(name = "具体明细表明细序号")
    private String scheduleDetailSn;
    /**
     * å°±è¯Šæ—¶é—´
     */
    @ApiModelProperty("就诊时间")
    @Excel(name = "就诊时间")
    @SerializedName("treatDate")
    private Date treatDate;
    /**
     * å°±è¯ŠåŒ»ç”Ÿç¼–码
     */
    @ApiModelProperty("就诊医生编码")
    @Excel(name = "就诊医生编码")
    private String treatDoctCode;
    /**
     * å°±è¯ŠåŒ»ç”Ÿåç§°
     */
    @ApiModelProperty("就诊医生名称")
    @Excel(name = "就诊医生名称")
    private String treatDoctName;
    /**
     * é¢„约渠道编码
     */
    @ApiModelProperty("预约渠道编码")
    @Excel(name = "预约渠道编码")
    private String regWayCode;
    /**
     * é¢„约渠道
     */
    @ApiModelProperty("预约渠道")
    @Excel(name = "预约渠道")
    private String regWay;
    /**
     * é¢„约系统编码
     */
    @ApiModelProperty("预约系统编码")
    @Excel(name = "预约系统编码")
    private String regSystemWayCode;
    /**
     * é¢„约系统
     */
    @ApiModelProperty("预约系统")
    @Excel(name = "预约系统")
    private String regSystemWay;
    /**
     * åˆè¯Šå¤è¯Šåˆ¤åˆ«ï¼ˆ0初诊 1复诊)
     */
    @ApiModelProperty("初诊复诊判别(0初诊 1复诊)")
    @Excel(name = "初诊复诊判别", readConverterExp = "0=初诊,1=复诊")
    private Long visitFlag;
    /**
     * çŸ­ä¿¡å‘送操作人id
     */
    @ApiModelProperty("短信发送操作人id")
    @Excel(name = "短信发送操作人id")
    private String senderId;
    /**
     * çŸ­ä¿¡å‘送操作人姓名
     */
    @ApiModelProperty("短信发送操作人姓名")
    @Excel(name = "短信发送操作人姓名")
    private String senderName;
    /**
     * çŸ­ä¿¡å‘送时间
     */
    @ApiModelProperty("短信发送时间")
    @Excel(name = "短信发送时间")
    private Date sendTime;
}
smartor/src/main/java/com/smartor/domain/ServiceOutPath.java
@@ -64,10 +64,24 @@
    @ApiModelProperty(value = "删除标记")
    private String delFlag;
    @ApiModelProperty(value = "进制")
    private String radix;
    @ApiModelProperty(value = "外链地址")
    private String url;
    @ApiModelProperty(value = "病区编码")
    private String wardCode;
    @ApiModelProperty(value = "病区名称")
    private String wardName;
    @ApiModelProperty(value = "科室编码")
    private String deptCode;
    @ApiModelProperty(value = "科室名称")
    private String deptName;
    @ApiModelProperty(value = "病人信息")
    private PatArchive patArchive;
smartor/src/main/java/com/smartor/domain/ServiceTaskScriptQues.java
@@ -46,10 +46,16 @@
    private String param4;
    /**
     * patfrom
     * æ‚£è€…来源
     */
    @Excel(name = "patfrom  ")
    @ApiModelProperty(value = "patfrom")
    private String patfrom = "0";
    /**
     * ç±»åž‹ï¼›0加密   1不加密
     */
    @ApiModelProperty(value = "类型;0加密   1不加密")
    private String type = "0";
}
smartor/src/main/java/com/smartor/domain/ServiceTaskVO.java
@@ -29,9 +29,9 @@
    private String taskDesc;
    /**
     * pageSize
     * æ˜¯å¦æ˜¯é•¿æœŸä»»åŠ¡ 0:临时任务    1:长期任务   2固定任务   3循环任务
     */
    @ApiModelProperty("是否是长期任务 0:不是    1:是")
    @ApiModelProperty("是否是长期任务 0:临时任务    1:长期任务   2固定任务   3循环任务")
    private Integer longTask = 0;
    /**
smartor/src/main/java/com/smartor/mapper/MedicationDoseInfoMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.smartor.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.smartor.domain.MedicationDoseInfo;
/**
 * è¯å“å‰‚量信息Mapper接口
 *
 * @author lihu
 * @date 2026-07-17
 */
@Mapper
public interface MedicationDoseInfoMapper
{
    /**
     * æŸ¥è¯¢è¯å“å‰‚量信息
     *
     * @param id è¯å“å‰‚量信息主键
     * @return è¯å“å‰‚量信息
     */
    public MedicationDoseInfo selectMedicationDoseInfoById(Long id);
    /**
     * æŸ¥è¯¢è¯å“å‰‚量信息列表
     *
     * @param medicationDoseInfo è¯å“å‰‚量信息
     * @return è¯å“å‰‚量信息集合
     */
    public List<MedicationDoseInfo> selectMedicationDoseInfoList(MedicationDoseInfo medicationDoseInfo);
    /**
     * æ–°å¢žè¯å“å‰‚量信息
     *
     * @param medicationDoseInfo è¯å“å‰‚量信息
     * @return ç»“æžœ
     */
    public int insertMedicationDoseInfo(MedicationDoseInfo medicationDoseInfo);
    /**
     * ä¿®æ”¹è¯å“å‰‚量信息
     *
     * @param medicationDoseInfo è¯å“å‰‚量信息
     * @return ç»“æžœ
     */
    public int updateMedicationDoseInfo(MedicationDoseInfo medicationDoseInfo);
    /**
     * åˆ é™¤è¯å“å‰‚量信息
     *
     * @param id è¯å“å‰‚量信息主键
     * @return ç»“æžœ
     */
    public int deleteMedicationDoseInfoById(Long id);
    /**
     * æ‰¹é‡åˆ é™¤è¯å“å‰‚量信息
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ä¸»é”®é›†åˆ
     * @return ç»“æžœ
     */
    public int deleteMedicationDoseInfoByIds(Long[] ids);
}
smartor/src/main/java/com/smartor/mapper/MedicationItemMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.smartor.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.smartor.domain.MedicationItem;
/**
 * è¯å“ä¿¡æ¯Mapper接口
 *
 * @author lihu
 * @date 2026-07-17
 */
@Mapper
public interface MedicationItemMapper
{
    /**
     * æŸ¥è¯¢è¯å“ä¿¡æ¯
     *
     * @param id è¯å“ä¿¡æ¯ä¸»é”®
     * @return è¯å“ä¿¡æ¯
     */
    public MedicationItem selectMedicationItemById(Long id);
    /**
     * æŸ¥è¯¢è¯å“ä¿¡æ¯åˆ—表
     *
     * @param medicationItem è¯å“ä¿¡æ¯
     * @return è¯å“ä¿¡æ¯é›†åˆ
     */
    public List<MedicationItem> selectMedicationItemList(MedicationItem medicationItem);
    /**
     * æ–°å¢žè¯å“ä¿¡æ¯
     *
     * @param medicationItem è¯å“ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int insertMedicationItem(MedicationItem medicationItem);
    /**
     * ä¿®æ”¹è¯å“ä¿¡æ¯
     *
     * @param medicationItem è¯å“ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateMedicationItem(MedicationItem medicationItem);
    /**
     * åˆ é™¤è¯å“ä¿¡æ¯
     *
     * @param id è¯å“ä¿¡æ¯ä¸»é”®
     * @return ç»“æžœ
     */
    public int deleteMedicationItemById(Long id);
    /**
     * æ‰¹é‡åˆ é™¤è¯å“ä¿¡æ¯
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ä¸»é”®é›†åˆ
     * @return ç»“æžœ
     */
    public int deleteMedicationItemByIds(Long[] ids);
}
smartor/src/main/java/com/smartor/mapper/ServiceAppointRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.smartor.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.smartor.domain.ServiceAppointRecord;
/**
 * é¢„约记录Mapper接口
 *
 * @author lihu
 * @date 2026-07-06
 */
@Mapper
public interface ServiceAppointRecordMapper
{
    /**
     * æŸ¥è¯¢é¢„约记录
     *
     * @param id é¢„约记录主键
     * @return é¢„约记录
     */
    public ServiceAppointRecord selectServiceAppointRecordById(Long id);
    /**
     * æŸ¥è¯¢é¢„约记录列表
     *
     * @param serviceAppointRecord é¢„约记录
     * @return é¢„约记录集合
     */
    public List<ServiceAppointRecord> selectServiceAppointRecordList(ServiceAppointRecord serviceAppointRecord);
    /**
     * æ–°å¢žé¢„约记录
     *
     * @param serviceAppointRecord é¢„约记录
     * @return ç»“æžœ
     */
    public int insertServiceAppointRecord(ServiceAppointRecord serviceAppointRecord);
    /**
     * ä¿®æ”¹é¢„约记录
     *
     * @param serviceAppointRecord é¢„约记录
     * @return ç»“æžœ
     */
    public int updateServiceAppointRecord(ServiceAppointRecord serviceAppointRecord);
    /**
     * åˆ é™¤é¢„约记录
     *
     * @param id é¢„约记录主键
     * @return ç»“æžœ
     */
    public int deleteServiceAppointRecordById(Long id);
    /**
     * æ‰¹é‡åˆ é™¤é¢„约记录
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ä¸»é”®é›†åˆ
     * @return ç»“æžœ
     */
    public int deleteServiceAppointRecordByIds(Long[] ids);
}
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java
@@ -10,6 +10,7 @@
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -248,9 +249,10 @@
    /**
     * ç»Ÿè®¡é—®é¢˜çš„选项的百分比
     *
     * @param taskIds
     * @return
     */
    List<ServiceSubtaskDetailRatioExport> statQuestionOption(@Param("taskIds") List<Long> taskIds);
    List<ServiceSubtaskDetailRatioExport> statQuestionOption(@Param("taskIds") List<Long> taskIds, @Param("startOutHospTime") Date startOutHospTime, @Param("endOutHospTime") Date endOutHospTime);
}
smartor/src/main/java/com/smartor/service/IMedicationDoseInfoService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.smartor.service;
import java.util.List;
import com.smartor.domain.MedicationDoseInfo;
/**
 * è¯å“å‰‚量信息Service接口
 *
 * @author lihu
 * @date 2026-07-17
 */
public interface IMedicationDoseInfoService
{
    /**
     * æŸ¥è¯¢è¯å“å‰‚量信息
     *
     * @param id è¯å“å‰‚量信息主键
     * @return è¯å“å‰‚量信息
     */
    public MedicationDoseInfo selectMedicationDoseInfoById(Long id);
    /**
     * æŸ¥è¯¢è¯å“å‰‚量信息列表
     *
     * @param medicationDoseInfo è¯å“å‰‚量信息
     * @return è¯å“å‰‚量信息集合
     */
    public List<MedicationDoseInfo> selectMedicationDoseInfoList(MedicationDoseInfo medicationDoseInfo);
    /**
     * æ–°å¢žè¯å“å‰‚量信息
     *
     * @param medicationDoseInfo è¯å“å‰‚量信息
     * @return ç»“æžœ
     */
    public int insertMedicationDoseInfo(MedicationDoseInfo medicationDoseInfo);
    /**
     * ä¿®æ”¹è¯å“å‰‚量信息
     *
     * @param medicationDoseInfo è¯å“å‰‚量信息
     * @return ç»“æžœ
     */
    public int updateMedicationDoseInfo(MedicationDoseInfo medicationDoseInfo);
    /**
     * æ‰¹é‡åˆ é™¤è¯å“å‰‚量信息
     *
     * @param ids éœ€è¦åˆ é™¤çš„药品剂量信息主键集合
     * @return ç»“æžœ
     */
    public int deleteMedicationDoseInfoByIds(Long[] ids);
    /**
     * åˆ é™¤è¯å“å‰‚量信息信息
     *
     * @param id è¯å“å‰‚量信息主键
     * @return ç»“æžœ
     */
    public int deleteMedicationDoseInfoById(Long id);
}
smartor/src/main/java/com/smartor/service/IMedicationItemService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.smartor.service;
import java.util.List;
import com.smartor.domain.MedicationItem;
/**
 * è¯å“ä¿¡æ¯Service接口
 *
 * @author lihu
 * @date 2026-07-17
 */
public interface IMedicationItemService
{
    /**
     * æŸ¥è¯¢è¯å“ä¿¡æ¯
     *
     * @param id è¯å“ä¿¡æ¯ä¸»é”®
     * @return è¯å“ä¿¡æ¯
     */
    public MedicationItem selectMedicationItemById(Long id);
    /**
     * æŸ¥è¯¢è¯å“ä¿¡æ¯åˆ—表
     *
     * @param medicationItem è¯å“ä¿¡æ¯
     * @return è¯å“ä¿¡æ¯é›†åˆ
     */
    public List<MedicationItem> selectMedicationItemList(MedicationItem medicationItem);
    /**
     * æ–°å¢žè¯å“ä¿¡æ¯
     *
     * @param medicationItem è¯å“ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int insertMedicationItem(MedicationItem medicationItem);
    /**
     * ä¿®æ”¹è¯å“ä¿¡æ¯
     *
     * @param medicationItem è¯å“ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateMedicationItem(MedicationItem medicationItem);
    /**
     * æ‰¹é‡åˆ é™¤è¯å“ä¿¡æ¯
     *
     * @param ids éœ€è¦åˆ é™¤çš„药品信息主键集合
     * @return ç»“æžœ
     */
    public int deleteMedicationItemByIds(Long[] ids);
    /**
     * åˆ é™¤è¯å“ä¿¡æ¯ä¿¡æ¯
     *
     * @param id è¯å“ä¿¡æ¯ä¸»é”®
     * @return ç»“æžœ
     */
    public int deleteMedicationItemById(Long id);
}
smartor/src/main/java/com/smartor/service/IServiceAppointRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.smartor.service;
import java.util.List;
import com.smartor.domain.ServiceAppointRecord;
/**
 * é¢„约记录Service接口
 *
 * @author lihu
 * @date 2026-07-06
 */
public interface IServiceAppointRecordService
{
    /**
     * æŸ¥è¯¢é¢„约记录
     *
     * @param id é¢„约记录主键
     * @return é¢„约记录
     */
    public ServiceAppointRecord selectServiceAppointRecordById(Long id);
    /**
     * æŸ¥è¯¢é¢„约记录列表
     *
     * @param serviceAppointRecord é¢„约记录
     * @return é¢„约记录集合
     */
    public List<ServiceAppointRecord> selectServiceAppointRecordList(ServiceAppointRecord serviceAppointRecord);
    /**
     * æ–°å¢žé¢„约记录
     *
     * @param serviceAppointRecord é¢„约记录
     * @return ç»“æžœ
     */
    public int insertServiceAppointRecord(ServiceAppointRecord serviceAppointRecord);
    /**
     * ä¿®æ”¹é¢„约记录
     *
     * @param serviceAppointRecord é¢„约记录
     * @return ç»“æžœ
     */
    public int updateServiceAppointRecord(ServiceAppointRecord serviceAppointRecord);
    /**
     * æ‰¹é‡åˆ é™¤é¢„约记录
     *
     * @param ids éœ€è¦åˆ é™¤çš„预约记录主键集合
     * @return ç»“æžœ
     */
    public int deleteServiceAppointRecordByIds(Long[] ids);
    /**
     * åˆ é™¤é¢„约记录信息
     *
     * @param id é¢„约记录主键
     * @return ç»“æžœ
     */
    public int deleteServiceAppointRecordById(Long id);
}
smartor/src/main/java/com/smartor/service/IServiceOutPathService.java
@@ -5,15 +5,15 @@
/**
 * ä¸»é”®Service接口
 *
 *
 * @author lihu
 * @date 2024-11-04
 */
public interface IServiceOutPathService
public interface IServiceOutPathService
{
    /**
     * æŸ¥è¯¢ä¸»é”®
     *
     *
     * @param id ä¸»é”®ä¸»é”®
     * @return ä¸»é”®
     */
@@ -21,7 +21,7 @@
    /**
     * æŸ¥è¯¢ä¸»é”®åˆ—表
     *
     *
     * @param serviceOutPath ä¸»é”®
     * @return ä¸»é”®é›†åˆ
     */
@@ -29,15 +29,23 @@
    /**
     * æ–°å¢žä¸»é”®
     *
     *
     * @param serviceOutPath ä¸»é”®
     * @return ç»“æžœ
     */
    public int insertServiceOutPath(ServiceOutPath serviceOutPath);
    /**
     * æ–°å¢žä¸»é”®
     *
     * @param serviceOutPath ä¸»é”®
     * @return ç»“æžœ
     */
    public String addOutPath(ServiceOutPath serviceOutPath);
    /**
     * ä¿®æ”¹ä¸»é”®
     *
     *
     * @param serviceOutPath ä¸»é”®
     * @return ç»“æžœ
     */
@@ -45,7 +53,7 @@
    /**
     * æ‰¹é‡åˆ é™¤ä¸»é”®
     *
     *
     * @param ids éœ€è¦åˆ é™¤çš„主键主键集合
     * @return ç»“æžœ
     */
@@ -53,7 +61,7 @@
    /**
     * åˆ é™¤ä¸»é”®ä¿¡æ¯
     *
     *
     * @param id ä¸»é”®ä¸»é”®
     * @return ç»“æžœ
     */
smartor/src/main/java/com/smartor/service/IServiceSLTDHealthcareRecordService.java
@@ -1,6 +1,7 @@
package com.smartor.service;
import afu.org.checkerframework.checker.oigj.qual.O;
import com.smartor.domain.MedicationItem;
import com.smartor.domain.ServiceSLTDDeptReqVO;
import com.smartor.domain.ServiceSLTDInhospReqVO;
import com.smartor.domain.ServiceSLTDInhospResDTO;
@@ -40,6 +41,14 @@
    List<ServiceSLTDInhospResDTO> queryHealthcareRecordList(ServiceSLTDInhospReqVO reqVO);
    /**
     * é‡‡é›†åœ¨é™¢æ‚£è€…用药信息
     *
     * @param reqVO æŸ¥è¯¢è¯·æ±‚参数
     * @return è¯å“åˆ—表
     */
    Boolean queryMedicationItemList(ServiceSLTDInhospReqVO reqVO);
    /**
     * é‡‡é›†åŒ»é™¢ç”¨æˆ·ä¿¡æ¯
     *
     * @param reqVO
@@ -70,8 +79,6 @@
     * }
     */
    Boolean queryDeptWardAreaInfoList(ServiceSLTDDeptReqVO serviceSLTDDeptReqVO);
    public void aa(Map<String, Object> map);
}
smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java
@@ -8,6 +8,7 @@
import com.smartor.domain.entity.ServiceSubtaskEntity;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -196,5 +197,5 @@
     * @param taskIds
     * @return
     */
    public List<ServiceSubtaskDetailRatioExport> statQuestionOption(List<Long> taskIds);
    public List<ServiceSubtaskDetailRatioExport> statQuestionOption(List<Long> taskIds, Date startOutHospTime, Date endOutHospTime);
}
smartor/src/main/java/com/smartor/service/IXHGatherPatArchiveService.java
@@ -18,5 +18,14 @@
     */
    public void getInHospDataGather(String cry, LocalDateTime startTime, LocalDateTime endTime);
    /**
     * èŽ·å–é¢„çº¦åœè¯Šè®°å½•ä¿¡æ¯
     *
     * @param cry       å‡ºå…¥é™¢ç±»åž‹ï¼š0-入院,1-出院 2,预约记录
     * @param startTime å¼€å§‹æ—¶é—´
     * @param endTime   ç»“束时间
     */
    public void getAppointRecordInfo(String cry, LocalDateTime startTime, LocalDateTime endTime);
}
smartor/src/main/java/com/smartor/service/impl/MedicationDoseInfoServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.smartor.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.smartor.mapper.MedicationDoseInfoMapper;
import com.smartor.domain.MedicationDoseInfo;
import com.smartor.service.IMedicationDoseInfoService;
/**
 * è¯å“å‰‚量信息Service业务层处理
 *
 * @author lihu
 * @date 2026-07-17
 */
@Service
public class MedicationDoseInfoServiceImpl implements IMedicationDoseInfoService
{
    @Autowired
    private MedicationDoseInfoMapper medicationDoseInfoMapper;
    /**
     * æŸ¥è¯¢è¯å“å‰‚量信息
     *
     * @param id è¯å“å‰‚量信息主键
     * @return è¯å“å‰‚量信息
     */
    @Override
    public MedicationDoseInfo selectMedicationDoseInfoById(Long id)
    {
        return medicationDoseInfoMapper.selectMedicationDoseInfoById(id);
    }
    /**
     * æŸ¥è¯¢è¯å“å‰‚量信息列表
     *
     * @param medicationDoseInfo è¯å“å‰‚量信息
     * @return è¯å“å‰‚量信息
     */
    @Override
    public List<MedicationDoseInfo> selectMedicationDoseInfoList(MedicationDoseInfo medicationDoseInfo)
    {
        return medicationDoseInfoMapper.selectMedicationDoseInfoList(medicationDoseInfo);
    }
    /**
     * æ–°å¢žè¯å“å‰‚量信息
     *
     * @param medicationDoseInfo è¯å“å‰‚量信息
     * @return ç»“æžœ
     */
    @Override
    public int insertMedicationDoseInfo(MedicationDoseInfo medicationDoseInfo)
    {
        medicationDoseInfo.setCreateTime(DateUtils.getNowDate());
        return medicationDoseInfoMapper.insertMedicationDoseInfo(medicationDoseInfo);
    }
    /**
     * ä¿®æ”¹è¯å“å‰‚量信息
     *
     * @param medicationDoseInfo è¯å“å‰‚量信息
     * @return ç»“æžœ
     */
    @Override
    public int updateMedicationDoseInfo(MedicationDoseInfo medicationDoseInfo)
    {
        medicationDoseInfo.setUpdateTime(DateUtils.getNowDate());
        return medicationDoseInfoMapper.updateMedicationDoseInfo(medicationDoseInfo);
    }
    /**
     * æ‰¹é‡åˆ é™¤è¯å“å‰‚量信息
     *
     * @param ids éœ€è¦åˆ é™¤çš„药品剂量信息主键
     * @return ç»“æžœ
     */
    @Override
    public int deleteMedicationDoseInfoByIds(Long[] ids)
    {
        return medicationDoseInfoMapper.deleteMedicationDoseInfoByIds(ids);
    }
    /**
     * åˆ é™¤è¯å“å‰‚量信息信息
     *
     * @param id è¯å“å‰‚量信息主键
     * @return ç»“æžœ
     */
    @Override
    public int deleteMedicationDoseInfoById(Long id)
    {
        return medicationDoseInfoMapper.deleteMedicationDoseInfoById(id);
    }
}
smartor/src/main/java/com/smartor/service/impl/MedicationItemServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.smartor.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.smartor.mapper.MedicationItemMapper;
import com.smartor.domain.MedicationItem;
import com.smartor.service.IMedicationItemService;
/**
 * è¯å“ä¿¡æ¯Service业务层处理
 *
 * @author lihu
 * @date 2026-07-17
 */
@Service
public class MedicationItemServiceImpl implements IMedicationItemService
{
    @Autowired
    private MedicationItemMapper medicationItemMapper;
    /**
     * æŸ¥è¯¢è¯å“ä¿¡æ¯
     *
     * @param id è¯å“ä¿¡æ¯ä¸»é”®
     * @return è¯å“ä¿¡æ¯
     */
    @Override
    public MedicationItem selectMedicationItemById(Long id)
    {
        return medicationItemMapper.selectMedicationItemById(id);
    }
    /**
     * æŸ¥è¯¢è¯å“ä¿¡æ¯åˆ—表
     *
     * @param medicationItem è¯å“ä¿¡æ¯
     * @return è¯å“ä¿¡æ¯
     */
    @Override
    public List<MedicationItem> selectMedicationItemList(MedicationItem medicationItem)
    {
        return medicationItemMapper.selectMedicationItemList(medicationItem);
    }
    /**
     * æ–°å¢žè¯å“ä¿¡æ¯
     *
     * @param medicationItem è¯å“ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public int insertMedicationItem(MedicationItem medicationItem)
    {
        medicationItem.setCreateTime(DateUtils.getNowDate());
        return medicationItemMapper.insertMedicationItem(medicationItem);
    }
    /**
     * ä¿®æ”¹è¯å“ä¿¡æ¯
     *
     * @param medicationItem è¯å“ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public int updateMedicationItem(MedicationItem medicationItem)
    {
        medicationItem.setUpdateTime(DateUtils.getNowDate());
        return medicationItemMapper.updateMedicationItem(medicationItem);
    }
    /**
     * æ‰¹é‡åˆ é™¤è¯å“ä¿¡æ¯
     *
     * @param ids éœ€è¦åˆ é™¤çš„药品信息主键
     * @return ç»“æžœ
     */
    @Override
    public int deleteMedicationItemByIds(Long[] ids)
    {
        return medicationItemMapper.deleteMedicationItemByIds(ids);
    }
    /**
     * åˆ é™¤è¯å“ä¿¡æ¯ä¿¡æ¯
     *
     * @param id è¯å“ä¿¡æ¯ä¸»é”®
     * @return ç»“æžœ
     */
    @Override
    public int deleteMedicationItemById(Long id)
    {
        return medicationItemMapper.deleteMedicationItemById(id);
    }
}
smartor/src/main/java/com/smartor/service/impl/ServiceAppointRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.smartor.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.smartor.mapper.ServiceAppointRecordMapper;
import com.smartor.domain.ServiceAppointRecord;
import com.smartor.service.IServiceAppointRecordService;
/**
 * é¢„约记录Service业务层处理
 *
 * @author lihu
 * @date 2026-07-06
 */
@Service
public class ServiceAppointRecordServiceImpl implements IServiceAppointRecordService
{
    @Autowired
    private ServiceAppointRecordMapper serviceAppointRecordMapper;
    /**
     * æŸ¥è¯¢é¢„约记录
     *
     * @param id é¢„约记录主键
     * @return é¢„约记录
     */
    @Override
    public ServiceAppointRecord selectServiceAppointRecordById(Long id)
    {
        return serviceAppointRecordMapper.selectServiceAppointRecordById(id);
    }
    /**
     * æŸ¥è¯¢é¢„约记录列表
     *
     * @param serviceAppointRecord é¢„约记录
     * @return é¢„约记录
     */
    @Override
    public List<ServiceAppointRecord> selectServiceAppointRecordList(ServiceAppointRecord serviceAppointRecord)
    {
        return serviceAppointRecordMapper.selectServiceAppointRecordList(serviceAppointRecord);
    }
    /**
     * æ–°å¢žé¢„约记录
     *
     * @param serviceAppointRecord é¢„约记录
     * @return ç»“æžœ
     */
    @Override
    public int insertServiceAppointRecord(ServiceAppointRecord serviceAppointRecord)
    {
        serviceAppointRecord.setCreateTime(DateUtils.getNowDate());
        return serviceAppointRecordMapper.insertServiceAppointRecord(serviceAppointRecord);
    }
    /**
     * ä¿®æ”¹é¢„约记录
     *
     * @param serviceAppointRecord é¢„约记录
     * @return ç»“æžœ
     */
    @Override
    public int updateServiceAppointRecord(ServiceAppointRecord serviceAppointRecord)
    {
        serviceAppointRecord.setUpdateTime(DateUtils.getNowDate());
        return serviceAppointRecordMapper.updateServiceAppointRecord(serviceAppointRecord);
    }
    /**
     * æ‰¹é‡åˆ é™¤é¢„约记录
     *
     * @param ids éœ€è¦åˆ é™¤çš„预约记录主键
     * @return ç»“æžœ
     */
    @Override
    public int deleteServiceAppointRecordByIds(Long[] ids)
    {
        return serviceAppointRecordMapper.deleteServiceAppointRecordByIds(ids);
    }
    /**
     * åˆ é™¤é¢„约记录信息
     *
     * @param id é¢„约记录主键
     * @return ç»“æžœ
     */
    @Override
    public int deleteServiceAppointRecordById(Long id)
    {
        return serviceAppointRecordMapper.deleteServiceAppointRecordById(id);
    }
}
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java
@@ -1050,6 +1050,13 @@
            int i = patMedInhospMapper.insertPatMedInhosp(patMedInhosp1);
            if (i != 1) return false;
        }
        //离院方式代码 1-医瞩离院 2-医嘱转院 3-医嘱转社区卫生服务机构/乡镇卫生院
        // 4-非医嘱离院 5-死亡 9-其他 10-介入室 20-手术室
        String liYuanQxdm = ObjectUtils.isNotEmpty(JiuZhenXX.get("LiYuanQXDM")) ? JiuZhenXX.get("LiYuanQXDM").toString() : null;
        if (ObjectUtils.isNotEmpty(liYuanQxdm) && ("5").equals(liYuanQxdm)) {
            deathPatProcess(liYuanQxdm,patMedInhosp1);
        }
        return true;
    }
@@ -1091,6 +1098,13 @@
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
            //离院方式代码 1-医瞩离院 2-医嘱转院 3-医嘱转社区卫生服务机构/乡镇卫生院
            // 4-非医嘱离院 5-死亡 9-其他 10-介入室 20-手术室
            String liYuanQxdm = ObjectUtils.isNotEmpty(JiuZhenXX.get("LiYuanQXDM")) ? JiuZhenXX.get("LiYuanQXDM").toString() : null;
            if (ObjectUtils.isNotEmpty(liYuanQxdm) && ("5").equals(liYuanQxdm)) {
                deathPatProcess(liYuanQxdm,patMedInhosp1);
            }
            return true;
        } else {
@@ -2086,4 +2100,45 @@
        return requestParams;
    }
    /**
     * æ­»äº¡æ‚£è€…处理
     * @param liYuanQxdm
     * @param patMedInhosp
     * @return
     */
    private int deathPatProcess(String liYuanQxdm, PatMedInhosp patMedInhosp){
        //死亡标记
        Boolean deathFlag = false;
        //判断病人是否死亡
        if (ObjectUtils.isNotEmpty(liYuanQxdm) && ("5").equals(liYuanQxdm)) {
            deathFlag = true;
        }
        PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp.getPatid());
        if(ObjectUtils.isNotEmpty(patArchive)) {
            patMedInhosp.setInhospstate("1");
            if (deathFlag) {
                //病人死亡无须随访
                patMedInhosp.setFuflag("0");
                //更新病人 notrequiredFlag
                patArchive.setNotrequiredFlag("1");
                patArchive.setNotrequiredreason("患者已离世");
                patArchiveMapper.updatePatArchive(patArchive);
                //对已经生成的随访任务进行处理
                ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
                serviceSubtaskVO.setPatid(patArchive.getId());
                serviceSubtaskVO.setSendstate(2L);
                List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
                for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
                    serviceSubtask.setSendstate(4L);
                    serviceSubtask.setRemark(serviceSubtask.getRemark() + ";患者已离世,不随访");
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                }
            } else {
                return 0;
            }
        }else {
            return -1;
        }
        return 1;
    }
}
smartor/src/main/java/com/smartor/service/impl/ServiceOutPathServiceImpl.java
@@ -1,11 +1,17 @@
package com.smartor.service.impl;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.RSAPublicKeyExample;
import com.smartor.domain.ServiceOutPath;
import com.smartor.domain.ServiceTask;
import com.smartor.mapper.ServiceOutPathMapper;
import com.smartor.mapper.ServiceTaskMapper;
import com.smartor.service.IServiceOutPathService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
@@ -18,6 +24,14 @@
public class ServiceOutPathServiceImpl implements IServiceOutPathService {
    @Autowired
    private ServiceOutPathMapper serviceOutPathMapper;
    @Autowired
    private ServiceTaskMapper serviceTaskMapper;
    @Value("${localIP}")
    private String localIP;
    @Value("${req_path}")
    private String req_path;
    @Value("${pub_key}")
    private String pub_key;
    /**
     * æŸ¥è¯¢ä¸»é”®
@@ -53,6 +67,40 @@
    }
    /**
     * æ–°å¢žä¸»é”®
     *
     * @param serviceOutPath ä¸»é”®
     * @return ç»“æžœ
     */
    @Override
    public String addOutPath(ServiceOutPath serviceOutPath) {
        ServiceTask serviceTask = serviceTaskMapper.selectServiceTaskByTaskid(Long.valueOf(serviceOutPath.getParam1()));
        RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
        String taskId = rsaPublicKeyExample.encryptedData(serviceOutPath.getParam1().toString(), pub_key);
        String patid= rsaPublicKeyExample.encryptedData(serviceOutPath.getParam2().toString(), pub_key);
        String subid= rsaPublicKeyExample.encryptedData(serviceOutPath.getParam6().toString(), pub_key);
        Date now = DateUtils.getNowDate();
        ServiceOutPath sop = new ServiceOutPath();
        sop.setParam1(taskId);
        sop.setParam2(patid);
        sop.setParam3(serviceTask.getTaskName());
        sop.setParam6(subid);
        sop.setCreateTime(now);
        sop.setUpdateTime(now);
        sop.setOrgid(serviceTask.getOrgid());
        sop.setDeptCode(serviceTask.getDeptcode());
        sop.setWardCode(serviceTask.getLeavehospitaldistrictcode());
        sop.setDeptName(serviceTask.getDeptname());
        sop.setWardName(serviceTask.getLeavehospitaldistrictname());
        serviceOutPathMapper.insertServiceOutPath(sop);
        //转成16进制并回写radix和updateTime
        serviceOutPath.setRadix(String.format("%03X", sop.getId()));
        serviceOutPath.setUrl(localIP + ":" + req_path + "/wt?p=" + sop.getRadix());
        serviceOutPathMapper.updateServiceOutPath(serviceOutPath);
        return serviceOutPath.getUrl();
    }
    /**
     * ä¿®æ”¹ä¸»é”®
     *
     * @param serviceOutPath ä¸»é”®
smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
@@ -63,6 +63,12 @@
    private SysUserRole2Mapper sysUserRoleMapper;
    @Autowired
    private MedicationItemMapper medicationItemMapper;
    @Autowired
    private MedicationDoseInfoMapper medicationDoseInfoMapper;
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    @Value("${sltd_pub_path}")
@@ -84,7 +90,12 @@
            Map<String, Object> requestParams = buildRequestParams(reqVO);
            Map<String, String> headers = buildRequestHeaders();
            log.info("请求参数出院数据地址:{},appKey:{}", sltdPubPath + "/osj/hbos-thirdparty-integration/standard/common/healthcareRecord/dtcQueryHealthcareRecordList", APP_KEY);
            String result = HttpUtils.sendPostByHeader(sltdPubPath + "/osj/hbos-thirdparty-integration/standard/common/healthcareRecord/dtcQueryHealthcareRecordList", new Gson().toJson(requestParams), headers);
            String result = null;
            if (reqVO.getSize() == null && reqVO.getCurrent() == null)
                result = HttpUtils.sendPostByHeader(sltdPubPath + "/osj/hbos-thirdparty-integration/standard/common/healthcareRecord/dtcQueryHealthcareRecordList", new Gson().toJson(requestParams), headers);
            else
                result = HttpUtils.sendPostByHeader(sltdPubPath + "/osj/hbos-thirdparty-integration/standard/common/healthcareRecord/dtcPageHealthcareRecordList", new Gson().toJson(requestParams), headers);
            log.info("queryHealthcareRecordList--result返回的结果值:{}", result == null ? "空值" : "有值");
            String cry = determineCry(reqVO);
            log.info("cry的值为:{}", cry);
@@ -95,6 +106,31 @@
            log.error("【queryHealthcareRecordList】调用省立同德健康记录查询接口异常,请求参数:{}", reqVO, e);
            throw new RuntimeException("调用省立同德健康记录查询接口失败:" + e.getMessage());
        }
    }
    @Override
    public Boolean queryMedicationItemList(ServiceSLTDInhospReqVO reqVO) {
        try {
            Map<String, Object> requestParams = buildRequestParams(reqVO);
            Map<String, String> headers = buildRequestHeaders();
            log.info("请求参药品信息地址:{},appKey:{}", sltdPubPath + "/hbos-thirdparty-integration/standard/base/mc/service/medication/queryMedicationInfoPage", APP_KEY);
            String result = HttpUtils.sendPostByHeader(sltdPubPath + "/hbos-thirdparty-integration/standard/base/mc/service/medication/queryMedicationInfoPage", new Gson().toJson(requestParams), headers);
            List<Map<String, Object>> dataList = getDataList(result, 2);
            for (Map<String, Object> dataItem : dataList) {
                MedicationItem medicationItem = convertToMedication(dataItem);
                log.info("medicationItem的值为:{}", medicationItem);
                medicationItemMapper.insertMedicationItem(medicationItem);
                List<MedicationDoseInfo> doseInfoList = medicationItem.getDoseInfoList();
                for (MedicationDoseInfo doseInfo : doseInfoList) {
                    doseInfo.setMedicationItemId(medicationItem.getId());
                    medicationDoseInfoMapper.insertMedicationDoseInfo(doseInfo);
                }
            }
        } catch (Exception e) {
            log.error("【queryMedicationItemList】调用省立同德药品信息查询接口异常,请求参数:{}", reqVO, e);
            throw new RuntimeException(e);
        }
        return true;
    }
@@ -136,7 +172,7 @@
            Map<String, String> headers = buildRequestHeaders();
            String result = HttpUtils.sendPostByHeader(sltdPubPath + "/osj/hbos-thirdparty-integration/standard/common/dept/queryDeptList", new Gson().toJson(params), headers);
            log.info("【queryDeptWardAreaInfoList】接口响应结果:{}", StringUtils.isEmpty(result) ? "空的" : "不空");
            List<Map<String, Object>> dataList = getDataList(result);
            List<Map<String, Object>> dataList = getDataList(result, 1);
            log.info("-----------dataList接口响应结果:{}", dataList.size());
            for (Map<String, Object> dataItem : dataList) {
                SysDept sysDept = new SysDept();
@@ -192,20 +228,6 @@
        return true;
    }
    @Override
    public void aa(Map<String, Object> map) {
        List<String> types = new ArrayList<>();
        types.add("FH0109.27");
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            String jsonString = objectMapper.writeValueAsString(map);
            parseResponseData(jsonString, types, "1", "20001001");
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
    /**
     * é‡‡é›†åŒ»é™¢ç”¨æˆ·ä¿¡æ¯
@@ -219,7 +241,7 @@
        Map<String, String> headers = buildRequestHeaders();
        String result = HttpUtils.sendPostByHeader(sltdPubPath + "/osj/hbos-thirdparty-integration/standard/common/staff/queryStaffList", new Gson().toJson(requestParams), headers);
        log.info("【queryHealthcareRecordList】接口响应结果是否有值:{}", StringUtils.isEmpty(result) ? "没值" : "有值");
        List<Map<String, Object>> dataList = getDataList(result);
        List<Map<String, Object>> dataList = getDataList(result, 1);
        for (Map<String, Object> dataItem : dataList) {
            SysUser sysUser = new SysUser();
            if (StringUtils.isEmpty(getStringValue(dataItem, "accountNo"))) {
@@ -355,17 +377,25 @@
    }
    private String determineCry(ServiceSLTDInhospReqVO reqVO) {
        if (CollectionUtils.isEmpty(reqVO.getStatusList())) return null;
        if (reqVO.getStatusList().contains("FH0109.24")) {
            //入院
            return "0";
        } else if (reqVO.getStatusList().contains("FH0109.27")) {
            //出院
            return "1";
        } else if (reqVO.getStatusList().contains("FH0109.22") || reqVO.getStatusList().contains("FH0109.23") || reqVO.getStatusList().contains("FH0109.53")) {
            //预入院
            return "3";
        if (CollectionUtils.isEmpty(reqVO.getStatusList()) && CollectionUtils.isEmpty(reqVO.getHealthcareRecordTypeList()))
            return null;
        if (reqVO.getStatusList() != null) {
            if (reqVO.getStatusList().contains("FH0109.24")) {
                //入院
                return "0";
            } else if (reqVO.getStatusList().contains("FH0109.27")) {
                //出院
                return "1";
            } else if (reqVO.getStatusList().contains("FH0109.22") || reqVO.getStatusList().contains("FH0109.23") || reqVO.getStatusList().contains("FH0109.53")) {
                //预入院
                return "3";
            }
        }
        if (reqVO.getHealthcareRecordTypeList() != null) {
            if (reqVO.getHealthcareRecordTypeList().contains("FH0108.03") || reqVO.getHealthcareRecordTypeList().contains("FH0108.01")) {
                //门急诊
                return "4";
            }
        }
        return null;
    }
@@ -376,7 +406,7 @@
            params.put("orgId", Long.parseLong(reqVO.getOrgId()));
        }
        if (reqVO.getCampusId() != null) {
            params.put("campusId", reqVO.getCampusId());
            params.put("campusIds", reqVO.getCampusId());
        }
        if (reqVO.getStartHeadTime() != null) {
            params.put("startHeadTime", reqVO.getStartHeadTime());
@@ -431,12 +461,13 @@
    private List<ServiceSLTDInhospResDTO> parseResponseData(String result, List<String> types, String cry, String campusId) {
        try {
            List<Map<String, Object>> dataList = getDataList(result);
            List<Map<String, Object>> dataList = getDataList(result, cry.equals("4") ? 2 : 1);
            log.info("【parseResponseData】成功解析dataList:{}条健康记录数据", dataList.size());
            List<ServiceSLTDInhospResDTO> resultList = new ArrayList<>();
            for (Map<String, Object> dataItem : dataList) {
                resultList.add(convertToDTO(dataItem));
            }
            log.info("【parseResponseData】成功解析{}条健康记录数据", resultList.size());
            log.info("【parseResponseData】成功解析resultList:{}条健康记录数据", resultList.size());
            processResultList(resultList, types, cry, campusId);
            return resultList;
@@ -446,11 +477,20 @@
        }
    }
    public List<Map<String, Object>> getDataList(String result) {
    /**
     * è§£æžæŽ¥å£è¿”回数据
     *
     * @param result æŽ¥å£è¿”回数据
     * @param flag   1代表,数组在data里,2代表数组在data/records里
     * @return è§£æžåŽçš„æ•°æ®åˆ—表
     */
    public List<Map<String, Object>> getDataList(String result, Integer flag) {
        Gson gson = new Gson();
        Type mapType = new TypeToken<Map<String, Object>>() {
        }.getType();
        Map<String, Object> responseMap = gson.fromJson(result, mapType);
        log.info("【parseResponseData】接口返回数据的responseMap:{}", Objects.isNull(responseMap) ? "空的" : "有值");
        Number codeNum = (Number) responseMap.get("code");
        String code = BigDecimal.valueOf(codeNum.longValue()).toPlainString();
        if (StringUtils.isEmpty(code) || !code.equals("200")) {
@@ -459,15 +499,30 @@
        }
        Object dataObj = responseMap.get("data");
        if (flag == 1) {
            dataObj = responseMap.get("data");
        } else if (flag == 2) {
            //门急诊的分页数据是在records中
            dataObj = ((Map<String, Object>) responseMap.get("data")).get("records");
            log.info("【parseResponseData】接口返回数据的dataObj:{}", Objects.isNull(dataObj) ? "空的" : "有值");
        }
        if (dataObj == null) {
            log.info("【parseResponseData】接口返回数据为空");
            return new ArrayList<>();
        }
        String dataJson = gson.toJson(dataObj);
        Type listType = new TypeToken<List<Map<String, Object>>>() {
        }.getType();
        List<Map<String, Object>> dataList = gson.fromJson(dataJson, listType);
        // å…¼å®¹data为数组或对象两种情况:接口正常时data为[{...}]数组,
        // å¼‚常或空数据时可能返回{}对象,直接按List解析会抛JsonSyntaxException
        List<Map<String, Object>> dataList;
        if (dataObj instanceof List) {
            String dataJson = gson.toJson(dataObj);
            Type listType = new TypeToken<List<Map<String, Object>>>() {
            }.getType();
            dataList = gson.fromJson(dataJson, listType);
        } else {
            log.info("【parseResponseData】接口返回data不是数组,而是对象类型,data内容:{}", gson.toJson(dataObj));
            return new ArrayList<>();
        }
        // ä½¿ç”¨ Set åŽ»é‡ï¼Œç¡®ä¿æ²¡æœ‰é‡å¤çš„æ•°æ®
        Set<Map<String, Object>> uniqueDataSet = new HashSet<>(dataList);
@@ -699,6 +754,14 @@
                    List<PatMedInhosp> patMedInhospList3 = patMedInhospService.selectPatMedInhosp(queryInhosp);
                    if (CollectionUtils.isEmpty(patMedInhospList3)) {
                        try {
                            //获取一下入院申请单
                            Map<String, String> headers = buildRequestHeaders();
                            Map<String, Object> requestParams = new HashMap<>();
                            requestParams.put("orgId", "20001001");
                            requestParams.put("20001001", patArchive.getPatidHis());
                            String result = HttpUtils.sendPostByHeader(sltdPubPath + "/hospitalizedApply/query", new Gson().toJson(requestParams), headers);
                            patMedInhospService.insertPatMedInhosp(patMedInhosp);
                            log.debug("成功插入预入院记录:serialnum={}", patMedInhosp.getSerialnum());
                        } catch (Exception e) {
@@ -1038,6 +1101,55 @@
        return dto;
    }
    private MedicationItem convertToMedication(Map<String, Object> dataItem) {
        MedicationItem dto = new MedicationItem();
        dto.setOrgId(getLongValue(dataItem, "orgId"));
        dto.setIdentificationCode(getStringValue(dataItem, "identificationCode"));
        dto.setWbm(getStringValue(dataItem, "wbm"));
        dto.setMedicationCommonName(getStringValue(dataItem, "medicationCommonName"));
        dto.setManufacturerName(getStringValue(dataItem, "manufacturerName"));
        dto.setItemCode(getStringValue(dataItem, "itemCode"));
        dto.setSmallLargePackageRatio(getLongValue(dataItem, "smallLargePackageRatio"));
        dto.setRemark(getStringValue(dataItem, "remark"));
        dto.setItemName(getStringValue(dataItem, "itemName"));
        dto.setMedicationType(getStringValue(dataItem, "medicationType"));
        Object mainDiagObj = dataItem.get("doseInfoList");
        List<MedicationDoseInfo> doseInfoList = new ArrayList<>();
        if (mainDiagObj instanceof List) {
            List<Map<String, Object>> mainDiagList = (List<Map<String, Object>>) mainDiagObj;
            for (Map<String, Object> mainDiagMap : mainDiagList) {
                MedicationDoseInfo medicationDoseInfo = new MedicationDoseInfo();
                medicationDoseInfo.setDoseSmallPackageRation(getBigDecimalValue(mainDiagMap, "doseSmallPackageRation"));
                medicationDoseInfo.setDose(getLongValue(mainDiagMap, "dose"));
                medicationDoseInfo.setDoseSmallPackageNum(getLongValue(mainDiagMap, "doseSmallPackageNum"));
                medicationDoseInfo.setDoseUnit(getStringValue(mainDiagMap, "doseUnit"));
                medicationDoseInfo.setDoseUnitType(getLongValue(mainDiagMap, "doseUnitType"));
                doseInfoList.add(medicationDoseInfo);
            }
        }
        dto.setDoseInfoList(doseInfoList);
        dto.setAntimicrobialGradeCode(getStringValue(dataItem, "antimicrobialGradeCode"));
        dto.setLicenseNumber(getStringValue(dataItem, "licenseNumber"));
        dto.setDefaultUsageName(getStringValue(dataItem, "defaultUsageName"));
        dto.setSpecialDrugsName(getStringValue(dataItem, "specialDrugsName"));
        dto.setAntimicrobialGradeName(getStringValue(dataItem, "antimicrobialGradeName"));
        dto.setCommonPinyin(getStringValue(dataItem, "commonPinyin"));
        dto.setCommonWbm(getStringValue(dataItem, "commonWbm"));
        dto.setManufacturerId(getLongValue(dataItem, "manufacturerId"));
        dto.setDefaultUsageId(getLongValue(dataItem, "defaultUsageId"));
        dto.setSpecification(getStringValue(dataItem, "specification"));
        dto.setSmallPackageUnit(getStringValue(dataItem, "smallPackageUnit"));
        dto.setItemId(getLongValue(dataItem, "itemId"));
        dto.setSpecialDrugsCode(getStringValue(dataItem, "specialDrugsCode"));
        dto.setPinyin(getStringValue(dataItem, "pinyin"));
        dto.setDoseFormName(getStringValue(dataItem, "doseFormName"));
        dto.setLargePackageUnit(getStringValue(dataItem, "largePackageUnit"));
        dto.setRetailPrice(getBigDecimalValue(dataItem, "retailPrice"));
        dto.setStatus(getLongValue(dataItem, "status"));
        return dto;
    }
    private List<ServiceSLTDContactsResDTO> parseContacts(List<?> contactsList) {
        List<ServiceSLTDContactsResDTO> contacts = new ArrayList<>();
        for (Object contactObj : contactsList) {
@@ -1082,6 +1194,16 @@
        return value instanceof Number ? new BigDecimal(value.toString()).toPlainString() : value.toString();
    }
    private BigDecimal getBigDecimalValue(Map<String, Object> map, String key) {
        Object value = map.get(key);
        if (value == null) {
            return null;
        }
        // åªå¤„理数字类型,避免科学计数法
        return new BigDecimal(value.toString());
    }
    private Long getLongValue(Map<String, Object> map, String key) {
        Object value = map.get(key);
        if (value == null) return null;
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
@@ -207,7 +207,7 @@
            if (key.contains("-WJscriptCache")) {
                List<SvyTaskTemplateScriptVO> cacheList = redisCache.getCacheList(key);
                cacheList.sort(Comparator.comparingLong(SvyTaskTemplateScriptVO::getSort));
                log.info("问卷回答结果:{}", cacheList);
                log.info("问卷回答结果:{}", CollectionUtils.isEmpty(cacheList) ? null : cacheList.size());
                for (int i = 0; i < cacheList.size(); i++) {
                    if (i == 0) {
                        //这个时间要找到第一题
@@ -231,13 +231,10 @@
                    } else {
                        SvyTaskTemplateScriptVO svyTaskTemplateScriptVO = cacheList.get(i);
                        log.info("svyTaskTemplateScriptVO的信息为:{},i的值为:{}", svyTaskTemplateScriptVO.getScriptno(), i);
//                        SvyTaskTemplateScriptVO svyTaskTemplateScriptVO = DtoConversionUtils.sourceToTarget(cacheList.get(i), SvyTaskTemplateScriptVO.class);
                        List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptions = cacheList.get(i).getSvyTaskTemplateTargetoptions();
//                        List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptions = DtoConversionUtils.sourceToTarget(cacheList.get(i).getSvyTaskTemplateTargetoptions(), SvyTaskTemplateTargetoption.class);
                        svyTaskTemplateScriptVO.setSvyTaskTemplateTargetoptions(svyTaskTemplateTargetoptions);
                        if (svyTaskTemplateScriptVO.getSort() != null && svyTaskTemplateScriptVO.getSort().equals(nextScriptno)) {
//                            log.error("svyTaskTemplateScriptVO的值为:{}", svyTaskTemplateScriptVO);
                            Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, Long.valueOf(split[1]), Long.valueOf(split[0]), Objects.isNull(split[2]) ? null : Long.valueOf(split[2]));
                            log.error("nextScriptNo的信息为:{}", map.get("nextScriptNo"));
                            if (!Objects.isNull(map.get("nextScriptNo")))
@@ -253,16 +250,14 @@
            } else if (key.contains("-SFscriptCache")) {
                List<IvrTaskTemplateScriptVO> cacheList = redisCache.getCacheList(key);
                cacheList.sort(Comparator.comparingLong(IvrTaskTemplateScriptVO::getSort));
                log.error("电话随访问卷回答结果:{}", cacheList.size());
                log.error("电话随访问卷回答结果:{}", CollectionUtils.isEmpty(cacheList) ? null : cacheList.size());
                for (int i = 0; i < cacheList.size(); i++) {
                    if (i == 0) {
                        //这个时间要找到第一题
                        for (IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO : cacheList) {
                            if (ivrTaskTemplateScriptVO.getSort() == 1L) {
                                //说明是第一题
//                                IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO = DtoConversionUtils.sourceToTarget(cacheList.get(0), IvrTaskTemplateScriptVO.class);
                                List<IvrTaskTemplateTargetoption> ivrTaskTemplateTargetoptions = cacheList.get(0).getIvrTaskScriptTargetoptionList();
//                                List<IvrTaskTemplateTargetoption> ivrTaskTemplateTargetoptions = DtoConversionUtils.sourceToTarget(ivrLibaTemplateTargetoptions, IvrTaskTemplateTargetoption.class);
                                ivrTaskTemplateScriptVO.setIvrTaskScriptTargetoptionList(ivrTaskTemplateTargetoptions);
                                Map<String, String> map = setSFInfo(ivrTaskTemplateScriptVO, tid, pid, subid);
                                if (!Objects.isNull(map.get("nextScriptNo")))
@@ -347,7 +342,7 @@
            if (serviceSubTaskCacheReq.getType() == 2) {
                List<SvyTaskTemplateScriptVO> cacheList = serviceSubTaskCacheReq.getSvyTaskTemplateScriptVOS();
                cacheList.sort(Comparator.comparingLong(SvyTaskTemplateScriptVO::getSort));
                log.info("问卷回答结果:{}", cacheList);
                log.info("问卷回答结果:{}", CollectionUtils.isEmpty(cacheList) ? null : cacheList.size());
                // é¢„查询循环中不变的数据,避免每题重复查数据库
                ServiceSubtaskEntity preSubtaskVO = new ServiceSubtaskEntity();
                preSubtaskVO.setTaskid(tid);
@@ -401,7 +396,7 @@
            } else if (serviceSubTaskCacheReq.getType() == 1) {
                List<IvrTaskTemplateScriptVO> cacheList = serviceSubTaskCacheReq.getIvrTaskTemplateScriptVOList();
                cacheList.sort(Comparator.comparingLong(vo -> Optional.ofNullable(vo.getSort()).orElse(0)));
                log.error("电话随访问卷回答结果:{}", cacheList.size());
                log.error("电话随访问卷回答结果:{}", CollectionUtils.isEmpty(cacheList) ? null : cacheList.size());
                for (int i = 0; i < cacheList.size(); i++) {
                    if (i == 0) {
                        //这个时间要找到第一题
@@ -650,7 +645,6 @@
        return true;
    }
    /**
     * å°†é—®é¢˜ä¿å­˜åˆ°ç¼“存中
     *
@@ -756,7 +750,7 @@
        map.put("templateName", serviceSubtask.getTemplatename());
        map.put("upTaskName", null);
        if (ObjectUtils.isNotEmpty(serviceSubtask) && serviceSubtask.getUpid() != null) {
            Map<String, Object> scriptInfoByCondition2 = serviceTaskService.getScriptInfoByCondition(serviceSubTaskQueryReq.getTaskid(), serviceSubTaskQueryReq.getPatid(), serviceSubTaskQueryReq.getIsFinish(), serviceSubTaskQueryReq.getPatfrom(),serviceSubTaskQueryReq.getSubId());
            Map<String, Object> scriptInfoByCondition2 = serviceTaskService.getScriptInfoByCondition(serviceSubTaskQueryReq.getTaskid(), serviceSubTaskQueryReq.getPatid(), serviceSubTaskQueryReq.getIsFinish(), serviceSubTaskQueryReq.getPatfrom(), serviceSubTaskQueryReq.getSubId());
            Map<String, Object> map1 = getMap(scriptInfoByCondition2, Long.valueOf(serviceSubtask.getUpid()), serviceSubTaskQueryReq.getPatid());
            if (!map1.isEmpty()) {
                map.put("upScriptResult", map1.get("scriptResult"));
@@ -901,9 +895,7 @@
        return map;
    }
    private Map<String, String> setWJInfo(SvyTaskTemplateScriptVO svyTaskTemplateScriptVO, Long taskid, Long patid, Long subid,
                                           List<ServiceSubtask> selectServiceSubtaskList, ServiceTask serviceTask,
                                           Map<Long, Long> existingDetailIdMap, Map<Long, Long> existingTraceIdMap) {
    private Map<String, String> setWJInfo(SvyTaskTemplateScriptVO svyTaskTemplateScriptVO, Long taskid, Long patid, Long subid, List<ServiceSubtask> selectServiceSubtaskList, ServiceTask serviceTask, Map<Long, Long> existingDetailIdMap, Map<Long, Long> existingTraceIdMap) {
        log.error("-----svyTaskTemplateScriptVO的值为:{}", svyTaskTemplateScriptVO);
        String score = "0";
        //下题跳转
@@ -931,6 +923,7 @@
            serviceSubtaskDetailVO.setAsrtext(StringUtils.isEmpty(svyTaskTemplateScriptVO.getScriptResult()) ? "" : svyTaskTemplateScriptVO.getScriptResult().replaceAll("^\"|\"$", ""));
            serviceSubtaskDetailVO.setMatchedtext(StringUtils.isEmpty(svyTaskTemplateScriptVO.getScriptResult()) ? "" : svyTaskTemplateScriptVO.getScriptResult().replaceAll("^\"|\"$", ""));
            serviceSubtaskDetailVO.setScore(svyTaskTemplateScriptVO.getScore() != null ? svyTaskTemplateScriptVO.getScore().toString() : "0");
            serviceSubtaskDetailVO.setAnswerps(svyTaskTemplateScriptVO.getAnswerps());
        } else {
            //非单多选
            if (StringUtils.isNotEmpty(svyTaskTemplateScriptVO.getScriptResult())) {
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -6,6 +6,7 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.dx.MessageSend;
import com.ruoyi.common.exception.base.BaseException;
@@ -184,6 +185,8 @@
    @Autowired
    private IPatMedOuthospService patMedOuthospService;
    @Autowired
    private SysDept2Mapper sysDept2Mapper;
    @Value("${spring.profiles.active}")
    private String active;
@@ -411,8 +414,8 @@
            if (serviceSubtaskRes.getSendstate() == 6) serviceSubtaskRes.setSendstateView(2L);
            if (serviceSubtaskRes.getSendstate() == 4) serviceSubtaskRes.setSendstateView(3L);
            // å¡«å……当前补偿
            if (StringUtils.isEmpty(serviceSubtask.getCurrentPreachform())){
                if(StringUtils.isNotEmpty(serviceSubtask.getPreachform())){
            if (StringUtils.isEmpty(serviceSubtask.getCurrentPreachform())) {
                if (StringUtils.isNotEmpty(serviceSubtask.getPreachform())) {
                    //默认取第一个
                    serviceSubtaskRes.setCurrentPreachform(serviceSubtask.getPreachform().split(",")[0]);
                }
@@ -692,7 +695,10 @@
                serviceTask.setTemplatename(tempName);
            }
            serviceTask.setLeaveldeptcodes(serviceTaskVO.getLeaveldeptcodes());
            serviceTask.setLeavehospitaldistrictcode(serviceTask.getLeavehospitaldistrictcode());
            if (StringUtils.isEmpty(serviceTask.getLeavehospitaldistrictname()) && StringUtils.isNotEmpty(serviceTask.getLeavehospitaldistrictcode())) {
                SysDept sysDept = sysDept2Mapper.selectDeptByCode(serviceTask.getLeavehospitaldistrictcode(), null);
                serviceTask.setLeavehospitaldistrictname(sysDept.getDeptName());
            }
            if (serviceTaskVO.getLongTask() == 1) serviceTask.setSendState(2L);
            serviceTask.setCreateTime(new Date());
            serviceTask.setUpdateTime(new Date());
@@ -718,8 +724,8 @@
                    //南华附一的icd10code是有重复的,所以不能用南华附一的icd10code去查询
                    log.info("----serviceTaskdiag的值为:{}", serviceTaskdiag);
                    if (!StringUtils.isEmpty(serviceTaskVO.getIcd10name())) {
                        String[] Icd10Names = serviceTaskVO.getIcd10name().split("$");
                        String[] Icd10codes = serviceTaskVO.getIcd10code().split("$");
                        String[] Icd10Names = serviceTaskVO.getIcd10name().split(",");
                        String[] Icd10codes = serviceTaskVO.getIcd10code().split(",");
                        for (int i = 0; i < Icd10Names.length; i++) {
                            serviceTaskdiag.setIcd10code(Icd10codes[i]);
                            serviceTaskdiag.setIcd10name(Icd10Names[i]);
@@ -2435,7 +2441,6 @@
            serviceSubtask.setRemark("电话接通成功,患者拒绝随访");
            serviceSubtask.setId(Long.valueOf(phoneCallRecordVO.getTaskid()));
            serviceSubtask.setSendstate(6L);
            serviceSubtask.setFinishtime(new Date());
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
//            int startIndex = phoneCallRecordVO.getRecord_path().indexOf("voice") + "voice".length() + 1;  // åŠ 1是跳过/符号
//            int endIndex = phoneCallRecordVO.getRecord_path().lastIndexOf("/");
@@ -3774,7 +3779,7 @@
        Map<String, String> map = new HashMap<>();
        map.put("phone", serviceSubtask.getPhone());
        map.put("content", sendMagParam.getContent());
        String result = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(map));
        HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(map));
        redisCache.setCacheObject(subTaskId + "recordAccept-hungup", "1", 10, TimeUnit.MINUTES);
        if (StringUtils.isNotEmpty(serviceSubtask.getRemark()))
            serviceSubtask.setRemark("电话发送拒接,短信补偿发送成功");
@@ -4688,8 +4693,8 @@
    }
    @Override
    public List<ServiceSubtaskDetailRatioExport> statQuestionOption(List<Long> taskIds) {
        return serviceSubtaskMapper.statQuestionOption(taskIds);
    public List<ServiceSubtaskDetailRatioExport> statQuestionOption(List<Long> taskIds, Date startOutHospTime, Date endOutHospTime) {
        return serviceSubtaskMapper.statQuestionOption(taskIds, startOutHospTime, endOutHospTime);
    }
    private Boolean saveServiceSubtaskDetail(ServiceSubtask serviceSubtask) {
smartor/src/main/java/com/smartor/service/impl/ServiceTaskServiceImpl.java
@@ -4,12 +4,10 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
@@ -18,7 +16,6 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import com.smartor.service.IServiceTaskService;
import org.springframework.transaction.annotation.Transactional;
@@ -34,49 +31,34 @@
public class ServiceTaskServiceImpl implements IServiceTaskService {
    @Autowired
    private ServiceTaskMapper serviceTaskMapper;
    @Autowired
    private ServiceSubtaskMapper serviceSubtaskMapper;
    @Autowired
    private ServiceTaskdeptMapper serviceTaskdeptMapper;
    @Autowired
    private PatArchiveImportMapper patArchiveImportMapper;
    @Autowired
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Autowired
    private HeLibraryMapper heLibraryMapper;
    @Autowired
    private SvyTaskTemplateScriptMapper svyTaskTemplateScriptMapper;
    @Autowired
    private IvrTaskTemplateScriptMapper ivrTaskTemplateScriptMapper;
    @Autowired
    private SvyLibTemplateScriptMapper svyLibTemplateScriptMapper;
    @Autowired
    private PatArchiveMapper patArchiveMapper;
    @Autowired
    private PatMedInhospMapper patMedInhospMapper;
    @Autowired
    private PatMedOuthospMapper patMedOuthospMapper;
    @Autowired
    private SvyLibTemplateTargetoptionMapper svyLibTemplateTargetoptionMapper;
    @Autowired
    private IvrTaskTemplateTargetoptionMapper ivrTaskTemplateTargetOptionMapper;
    @Autowired
    private SvyTaskTemplateTargetoptionMapper svyTaskTemplateTargetoptionMapper;
    @Autowired
    private RedisCache redisCache;
@@ -287,13 +269,14 @@
                serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(ssp);
            }
        }
        if (StringUtils.isNotEmpty(serviceTask.getKcb())) map.put("kcb", serviceTask.getKcb());
        map.put("script", info);
        if (StringUtils.isNotEmpty(serviceTask.getJsy())) map.put("jsy", serviceTask.getJsy());
        map.put("type", serviceTask.getType());
        map.put("taskName", serviceTask.getTaskName());
        map.put("submit", "0");
        if (serviceTask != null) {
            if (StringUtils.isNotEmpty(serviceTask.getKcb())) map.put("kcb", serviceTask.getKcb());
            map.put("script", info);
            if (StringUtils.isNotEmpty(serviceTask.getJsy())) map.put("jsy", serviceTask.getJsy());
            map.put("type", serviceTask.getType());
            map.put("taskName", serviceTask.getTaskName());
            map.put("submit", "0");
        }
        return map;
    }
@@ -435,7 +418,6 @@
            if (StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getScriptContent())) {
                for (Map<String, String> map : mapList) {
                    for (String key : map.keySet()) {
                        ivrTaskTemplateScriptVO.setScriptContent(ivrTaskTemplateScriptVO.getScriptContent().replace(key, StringUtils.isNotEmpty(map.get(key)) ? map.get(key) : ""));
                    }
                }
@@ -486,8 +468,7 @@
        //通过模板ID获取问题信息
        SvyTaskTemplateScript svyTaskTemplateScript = new SvyTaskTemplateScript();
        svyTaskTemplateScript.setTemplateID(Long.valueOf(serviceTask.getTemplateid()));
        if (CollectionUtils.isNotEmpty(serviceSubtaskList) && serviceSubtaskList.get(0).getTemplateid() != null)
            svyTaskTemplateScript.setTemplateID(serviceSubtaskList.get(0).getTemplateid());
        if (serviceTask.getTemplateid() != null) svyTaskTemplateScript.setTemplateID(serviceTask.getTemplateid());
        svyTaskTemplateScript.setDelFlag("0");
        List<SvyTaskTemplateScript> svyTaskTemplateScripts = svyTaskTemplateScriptMapper.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
        if (CollectionUtils.isEmpty(svyTaskTemplateScripts) || svyTaskTemplateScripts.size() == 0) {
smartor/src/main/java/com/smartor/service/impl/XHGatherPatArchiveServiceImpl.java
@@ -3,19 +3,20 @@
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.SysUserDept;
import com.ruoyi.common.core.domain.entity.SysUserRole;
import com.ruoyi.common.utils.HttpUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.smartor.domain.*;
import com.smartor.mapper.*;
import com.smartor.service.IHNGatherPatArchiveService;
import com.smartor.service.IPatArchiveService;
import com.smartor.service.IPatMedInhospService;
import com.smartor.service.IXHGatherPatArchiveService;
import com.smartor.service.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -27,6 +28,7 @@
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Type;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
@@ -47,13 +49,26 @@
    @Value("${hosp_info_url}")
    private String hospInfoUrl;
    @Autowired
    IPatMedInhospService patMedInhospService;
    @Autowired
    IPatArchiveService patArchiveService;
    @Autowired
    IServiceAppointRecordService iServiceAppointRecordService;
    @Autowired
    private SysConfigMapper sysConfigMapper;
    @Value("${xhsmsPath}")
    private String xhsmsPath;
    // å¸å·
    @Value("${xhsmsAccount}")
    private String xhsmsAccount;
    //  æŽ¥å£å¯†ç 
    @Value("${xhsmsPwd}")
    private String xhsmsPwd;
    // è™šæ‹ŸæŽ¥å…¥ç 
    @Value("${xhsmsjrm}")
    private String xhsmsjrm;
    /**
     * èŽ·å–æ‚£è€…å‡ºå…¥é™¢ä¿¡æ¯
@@ -94,6 +109,72 @@
        }
    }
    /**
     * èŽ·å–é¢„çº¦åœè¯Šè®°å½•ä¿¡æ¯
     *
     * @param cry       å‡ºå…¥é™¢ç±»åž‹ï¼š0-入院,1-出院 2,预约记录
     * @param startTime å¼€å§‹æ—¶é—´
     * @param endTime   ç»“束时间
     */
    public void getAppointRecordInfo(String cry, LocalDateTime startTime, LocalDateTime endTime) {
        log.info("【getAppointRecordInfo】开始获取取预约停诊记录信息,时间范围:{} ~ {}", startTime, endTime);
        long startTimeMillis = System.currentTimeMillis();
        try {
            // ç¬¬ä¸€æ­¥ï¼šæž„建请求参数并调用HIS接口
            List<ServiceAppointRecord> appointRecordFromHIS = getAppointRecordFromHIS(cry, startTime, endTime);
            if (CollectionUtils.isEmpty(appointRecordFromHIS)) {
                log.info("【getAppointRecordInfo】获取预约停诊记录信息为空,跳过处理");
                return;
            }
            log.info("【getAppointRecordInfo】获取预约停诊记录信息{}条", appointRecordFromHIS.size());
            SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("yytz.sms.template");
            if (sysConfig != null) {
                String smsContemt = sysConfig.getConfigValue();
                // ç¬¬äºŒæ­¥ï¼šå¤„理停诊记录信息
                for (ServiceAppointRecord serviceAppointRecord : appointRecordFromHIS) {
                    String replace = smsContemt.replace("${patFileName}", StringUtils.defaultString(serviceAppointRecord.getPatFileName())).replace("${registTimeRange}", StringUtils.defaultString(serviceAppointRecord.getRegistTimeRange())).replace("${registDeptName}", StringUtils.defaultString(serviceAppointRecord.getRegistDeptName())).replace("${treatDoctName}", StringUtils.defaultString(serviceAppointRecord.getTreatDoctName()));
                    Map<String, String> map2 = new HashMap<String, String>();
                    map2.put("action", "send");
                    map2.put("account", xhsmsAccount);
                    map2.put("password", xhsmsPwd);
                    map2.put("mobile", serviceAppointRecord.getPatTel());
                    map2.put("content", replace);
                    map2.put("extno", xhsmsjrm);
                    map2.put("rt", "json");
                    StringBuilder encodedParams = new StringBuilder();
                    for (Map.Entry<String, String> entry : map2.entrySet()) {
                        if (encodedParams.length() > 0) {
                            encodedParams.append("&");
                        }
                        // å¯¹é”®å’Œå€¼è¿›è¡ŒURL编码
                        String encodedKey = URLEncoder.encode(entry.getKey(), "UTF-8");
                        String encodedValue = URLEncoder.encode(entry.getValue(), "UTF-8");
                        encodedParams.append(encodedKey).append("=").append(encodedValue);
                    }
                    Boolean isSuccess = HttpUtils.sendPost(xhsmsPath, encodedParams.toString());
                    if (isSuccess) {
                        log.info("---处理停诊记录信息发送成功,入参为:{}", encodedParams.toString());
                        serviceAppointRecord.setSendTime(new Date());
                        serviceAppointRecord.setSenderName("系统管理员");
                        iServiceAppointRecordService.insertServiceAppointRecord(serviceAppointRecord);
                    } else {
                        log.info("处理停诊记录信息发送失败");
                        iServiceAppointRecordService.insertServiceAppointRecord(serviceAppointRecord);
                    }
                }
            }
            long endTimeMillis = System.currentTimeMillis();
            log.info("【getAppointRecordInfo】{},预约停诊记录信息处理完成,耗时:{}ms", endTimeMillis - startTimeMillis);
        } catch (Exception e) {
            log.error("【getAppointRecordInfo】获取预约停诊记录信息处理异常", e);
            throw new RuntimeException("获取预约停诊记录信息处理异常", e);
        }
    }
    /**
     * ç¬¬ä¸€æ­¥ï¼šè°ƒç”¨HIS接口获取数据
@@ -117,6 +198,29 @@
            throw e;
        }
    }
    private List<ServiceAppointRecord> getAppointRecordFromHIS(String cry, LocalDateTime startTime, LocalDateTime endTime) {
        try {
            // æž„建请求参数
            Map<String, String> requestParams = buildRequestParams(cry, startTime, endTime);
            // æž„建请求头
            Map<String, String> headers = buildRequestHeaders(startTime);
            // å‘送HTTP请求
            log.info("【getAppointRecordFromHIS】发送HTTP请求,请求参数:{},请求地址:{}", new Gson().toJson(requestParams), hospInfoUrl);
            String result = HttpUtils.sendPostByHeader(hospInfoUrl, new Gson().toJson(requestParams), headers);
            // è§£æžå“åº”数据
            return parseResponseData2(result);
        } catch (Exception e) {
            log.error("【fetchHisData】调用HIS接口异常", e);
            throw e;
        }
    }
    /**
     * ç¬¬äºŒæ­¥ï¼šä¿å­˜åŽŸå§‹æ•°æ®åˆ°æ–‡ä»¶
@@ -180,7 +284,8 @@
    private Map<String, String> buildRequestHeaders(LocalDateTime startTime) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
        Map<String, String> header = new HashMap<>();
        header.put("x-hcsb-serviceno", "IS002347");
        header.put("x-hcsb-serviceno", "IS044056");
//        header.put("x-hcsb-serviceno", "IS002347");
        header.put("x-hcsb-version", "2.0");
        header.put("x-hcsb-sourcesyscode", "14");
        header.put("x-hcsb-token", "ArGE2JnHtxG/Zx5nrnGY4eOfMUJGGJokAJHigG1BrCY=");
@@ -201,11 +306,17 @@
            req.put("cashStartDate", startTime.format(formatter));
            req.put("cashEndDate", endTime.format(formatter));
            req.put("currStatus", "4");
        } else {
        } else if ("0".equals(cry)) {
            // å…¥é™¢å‚æ•°
            req.put("admissStartDate", startTime.format(formatter));
            req.put("admissEndDate", endTime.format(formatter));
            req.put("currStatus", "2");
        } else if ("2".equals(cry)) {
            // é¢„约记录查询
            req.put("appointRegistDateBegin", startTime.format(formatter));
            req.put("appointRegistDateEnd", endTime.format(formatter));
            // æŽ’班停诊 ï¼ˆé¢„约状态标志(0:已预约  1:已挂号  2:已退号  3:已就诊  -1:病人取消  -2:医院取消  -3:排班停诊))
            req.put("scheduleStatusFlag", "-3");
        }
        return req;
@@ -218,7 +329,22 @@
        try {
            Gson gson = new Gson();
            JsonObject jsonObject = gson.fromJson(result, JsonObject.class);
            JsonArray resultArray = jsonObject.getAsJsonObject("data").getAsJsonArray("result");
            // æ ¡éªŒdata字段是否为JsonObject
            JsonElement dataElement = jsonObject.get("data");
            if (dataElement == null || !dataElement.isJsonObject()) {
                log.warn("【parseResponseData】响应数据中data字段为空或非对象类型,原始数据:{}", result);
                return new ArrayList<>();
            }
            JsonObject dataObject = dataElement.getAsJsonObject();
            JsonElement resultElement = dataObject.get("result");
            if (resultElement == null || !resultElement.isJsonArray()) {
                log.warn("【parseResponseData】响应数据中result字段为空或非数组类型,原始数据:{}", result);
                return new ArrayList<>();
            }
            JsonArray resultArray = resultElement.getAsJsonArray();
            Type resultType = new TypeToken<List<ThiedInhospInfo>>() {
            }.getType();
            return gson.fromJson(resultArray, resultType);
@@ -228,6 +354,38 @@
        }
    }
    /**
     * è§£æžå“åº”数据
     */
    private List<ServiceAppointRecord> parseResponseData2(String result) {
        try {
            Gson gson = new Gson();
            JsonObject jsonObject = gson.fromJson(result, JsonObject.class);
            // æ ¡éªŒdata字段是否为JsonObject
            JsonElement dataElement = jsonObject.get("data");
            if (dataElement == null || !dataElement.isJsonObject()) {
                log.warn("【parseResponseData2】响应数据中data字段为空或非对象类型,原始数据:{}", result);
                return new ArrayList<>();
            }
            JsonObject dataObject = dataElement.getAsJsonObject();
            JsonElement resultElement = dataObject.get("result");
            if (resultElement == null || !resultElement.isJsonArray()) {
                log.warn("【parseResponseData2】响应数据中result字段为空或非数组类型,原始数据:{}", result);
                return new ArrayList<>();
            }
            JsonArray resultArray = resultElement.getAsJsonArray();
            Type resultType = new TypeToken<List<ServiceAppointRecord>>() {
            }.getType();
            return gson.fromJson(resultArray, resultType);
        } catch (Exception e) {
            log.error("【parseResponseData2】解析响应数据异常,原始数据:{}", result, e);
            throw e;
        }
    }
    /**
     * å¤„理单个患者数据
smartor/src/main/resources/mapper/smartor/MedicationDoseInfoMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,172 @@
<?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.smartor.mapper.MedicationDoseInfoMapper">
    <resultMap type="com.smartor.domain.MedicationDoseInfo" id="MedicationDoseInfoResult">
            <result property="id" column="id"/>
            <result property="medicationItemId" column="medication_item_id"/>
            <result property="doseSmallPackageRation" column="dose_small_package_ration"/>
            <result property="dose" column="dose"/>
            <result property="doseSmallPackageNum" column="dose_small_package_num"/>
            <result property="doseUnit" column="dose_unit"/>
            <result property="doseUnitType" column="dose_unit_type"/>
            <result property="remark" column="remark"/>
            <result property="createBy" column="create_by"/>
            <result property="createTime" column="create_time"/>
            <result property="updateBy" column="update_by"/>
            <result property="updateTime" column="update_time"/>
    </resultMap>
    <sql id="selectMedicationDoseInfoVo">
        select id, medication_item_id, dose_small_package_ration, dose, dose_small_package_num, dose_unit, dose_unit_type, remark, create_by, create_time, update_by, update_time
        from medication_dose_info
    </sql>
    <select id="selectMedicationDoseInfoList" parameterType="com.smartor.domain.MedicationDoseInfo"
            resultMap="MedicationDoseInfoResult">
        <include refid="selectMedicationDoseInfoVo"/>
        where 1=1
            and del_flag=0
                        <if test="medicationItemId != null ">
                            and medication_item_id = #{medicationItemId}
                        </if>
                        <if test="doseSmallPackageRation != null ">
                            and dose_small_package_ration = #{doseSmallPackageRation}
                        </if>
                        <if test="dose != null ">
                            and dose = #{dose}
                        </if>
                        <if test="doseSmallPackageNum != null ">
                            and dose_small_package_num = #{doseSmallPackageNum}
                        </if>
                        <if test="doseUnit != null  and doseUnit != ''">
                            and dose_unit = #{doseUnit}
                        </if>
                        <if test="doseUnitType != null ">
                            and dose_unit_type = #{doseUnitType}
                        </if>
    </select>
    <select id="selectMedicationDoseInfoById" parameterType="Long"
            resultMap="MedicationDoseInfoResult">
            <include refid="selectMedicationDoseInfoVo"/>
            where id = #{id}
    </select>
    <insert id="insertMedicationDoseInfo" parameterType="com.smartor.domain.MedicationDoseInfo"            useGeneratedKeys="true" keyProperty="id">
        insert into medication_dose_info
        <trim prefix="(" suffix=")" suffixOverrides=",">
                    <if test="medicationItemId != null">medication_item_id,
                    </if>
                    <if test="doseSmallPackageRation != null">dose_small_package_ration,
                    </if>
                    <if test="dose != null">dose,
                    </if>
                    <if test="doseSmallPackageNum != null">dose_small_package_num,
                    </if>
                    <if test="doseUnit != null">dose_unit,
                    </if>
                    <if test="doseUnitType != null">dose_unit_type,
                    </if>
                    <if test="remark != null">remark,
                    </if>
                    <if test="createBy != null">create_by,
                    </if>
                    <if test="createTime != null">create_time,
                    </if>
                    <if test="updateBy != null">update_by,
                    </if>
                    <if test="updateTime != null">update_time,
                    </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
                    <if test="medicationItemId != null">#{medicationItemId},
                    </if>
                    <if test="doseSmallPackageRation != null">#{doseSmallPackageRation},
                    </if>
                    <if test="dose != null">#{dose},
                    </if>
                    <if test="doseSmallPackageNum != null">#{doseSmallPackageNum},
                    </if>
                    <if test="doseUnit != null">#{doseUnit},
                    </if>
                    <if test="doseUnitType != null">#{doseUnitType},
                    </if>
                    <if test="remark != null">#{remark},
                    </if>
                    <if test="createBy != null">#{createBy},
                    </if>
                    <if test="createTime != null">#{createTime},
                    </if>
                    <if test="updateBy != null">#{updateBy},
                    </if>
                    <if test="updateTime != null">#{updateTime},
                    </if>
        </trim>
    </insert>
    <update id="updateMedicationDoseInfo" parameterType="com.smartor.domain.MedicationDoseInfo">
        update medication_dose_info
        <trim prefix="SET" suffixOverrides=",">
                    <if test="medicationItemId != null">medication_item_id =
                        #{medicationItemId},
                    </if>
                    <if test="doseSmallPackageRation != null">dose_small_package_ration =
                        #{doseSmallPackageRation},
                    </if>
                    <if test="dose != null">dose =
                        #{dose},
                    </if>
                    <if test="doseSmallPackageNum != null">dose_small_package_num =
                        #{doseSmallPackageNum},
                    </if>
                    <if test="doseUnit != null">dose_unit =
                        #{doseUnit},
                    </if>
                    <if test="doseUnitType != null">dose_unit_type =
                        #{doseUnitType},
                    </if>
                    <if test="remark != null">remark =
                        #{remark},
                    </if>
                    <if test="createBy != null">create_by =
                        #{createBy},
                    </if>
                    <if test="createTime != null">create_time =
                        #{createTime},
                    </if>
                    <if test="updateBy != null">update_by =
                        #{updateBy},
                    </if>
                    <if test="updateTime != null">update_time =
                        #{updateTime},
                    </if>
        </trim>
        where id = #{id}
    </update>
                <update id="deleteMedicationDoseInfoById" parameterType="Long">
        update medication_dose_info
        <trim prefix="SET" suffixOverrides=",">
            del_flag =1
        </trim>
        where  id = #{id}
    </update>
                            <update id="deleteMedicationDoseInfoByIds" parameterType="String">
        update  medication_dose_info
        <trim prefix="SET" suffixOverrides=",">
            del_flag =1
        </trim>
        where id in
        <foreach item="id" collection="array" open="(" separator="," close=")">
            #{id}
        </foreach>
    </update>
</mapper>
smartor/src/main/resources/mapper/smartor/MedicationItemMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,434 @@
<?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.smartor.mapper.MedicationItemMapper">
    <resultMap type="com.smartor.domain.MedicationItem" id="MedicationItemResult">
        <result property="id" column="id"/>
        <result property="identificationCode" column="identification_code"/>
        <result property="wbm" column="wbm"/>
        <result property="medicationCommonName" column="medication_common_name"/>
        <result property="manufacturerName" column="manufacturer_name"/>
        <result property="itemCode" column="item_code"/>
        <result property="smallLargePackageRatio" column="small_large_package_ratio"/>
        <result property="remark" column="remark"/>
        <result property="orgId" column="org_id"/>
        <result property="itemName" column="item_name"/>
        <result property="medicationType" column="medication_type"/>
        <result property="antimicrobialGradeCode" column="antimicrobial_grade_code"/>
        <result property="licenseNumber" column="license_number"/>
        <result property="defaultUsageName" column="default_usage_name"/>
        <result property="specialDrugsName" column="special_drugs_name"/>
        <result property="antimicrobialGradeName" column="antimicrobial_grade_name"/>
        <result property="commonPinyin" column="common_pinyin"/>
        <result property="commonWbm" column="common_wbm"/>
        <result property="manufacturerId" column="manufacturer_id"/>
        <result property="defaultUsageId" column="default_usage_id"/>
        <result property="specification" column="specification"/>
        <result property="smallPackageUnit" column="small_package_unit"/>
        <result property="itemId" column="item_id"/>
        <result property="specialDrugsCode" column="special_drugs_code"/>
        <result property="pinyin" column="pinyin"/>
        <result property="doseFormName" column="dose_form_name"/>
        <result property="largePackageUnit" column="large_package_unit"/>
        <result property="retailPrice" column="retail_price"/>
        <result property="status" column="status"/>
        <result property="createBy" column="create_by"/>
        <result property="createTime" column="create_time"/>
        <result property="updateBy" column="update_by"/>
        <result property="updateTime" column="update_time"/>
    </resultMap>
    <sql id="selectMedicationItemVo">
        select id,
               identification_code,
               wbm,
               medication_common_name,
               manufacturer_name,
               item_code,
               small_large_package_ratio,
               remark,
               org_id,
               item_name,
               medication_type,
               antimicrobial_grade_code,
               license_number,
               default_usage_name,
               special_drugs_name,
               antimicrobial_grade_name,
               common_pinyin,
               common_wbm,
               manufacturer_id,
               default_usage_id,
               specification,
               small_package_unit,
               item_id,
               special_drugs_code,
               pinyin,
               dose_form_name,
               large_package_unit,
               retail_price,
               status,
               create_by,
               create_time,
               update_by,
               update_time
        from medication_item
    </sql>
    <select id="selectMedicationItemList" parameterType="com.smartor.domain.MedicationItem"
            resultMap="MedicationItemResult">
        <include refid="selectMedicationItemVo"/>
        where 1=1
        and del_flag=0
        <if test="identificationCode != null  and identificationCode != ''">
            and identification_code = #{identificationCode}
        </if>
        <if test="wbm != null  and wbm != ''">
            and wbm = #{wbm}
        </if>
        <if test="medicationCommonName != null  and medicationCommonName != ''">
            and medication_common_name like concat('%', #{medicationCommonName}, '%')
        </if>
        <if test="manufacturerName != null  and manufacturerName != ''">
            and manufacturer_name like concat('%', #{manufacturerName}, '%')
        </if>
        <if test="itemCode != null  and itemCode != ''">
            and item_code = #{itemCode}
        </if>
        <if test="smallLargePackageRatio != null ">
            and small_large_package_ratio = #{smallLargePackageRatio}
        </if>
        <if test="orgId != null ">
            and org_id = #{orgId}
        </if>
        <if test="itemName != null  and itemName != ''">
            and item_name like concat('%', #{itemName}, '%')
        </if>
        <if test="medicationType != null  and medicationType != ''">
            and medication_type = #{medicationType}
        </if>
        <if test="antimicrobialGradeCode != null  and antimicrobialGradeCode != ''">
            and antimicrobial_grade_code = #{antimicrobialGradeCode}
        </if>
        <if test="licenseNumber != null  and licenseNumber != ''">
            and license_number = #{licenseNumber}
        </if>
        <if test="defaultUsageName != null  and defaultUsageName != ''">
            and default_usage_name like concat('%', #{defaultUsageName}, '%')
        </if>
        <if test="specialDrugsName != null  and specialDrugsName != ''">
            and special_drugs_name like concat('%', #{specialDrugsName}, '%')
        </if>
        <if test="antimicrobialGradeName != null  and antimicrobialGradeName != ''">
            and antimicrobial_grade_name like concat('%', #{antimicrobialGradeName}, '%')
        </if>
        <if test="commonPinyin != null  and commonPinyin != ''">
            and common_pinyin = #{commonPinyin}
        </if>
        <if test="commonWbm != null  and commonWbm != ''">
            and common_wbm = #{commonWbm}
        </if>
        <if test="manufacturerId != null ">
            and manufacturer_id = #{manufacturerId}
        </if>
        <if test="defaultUsageId != null ">
            and default_usage_id = #{defaultUsageId}
        </if>
        <if test="specification != null  and specification != ''">
            and specification = #{specification}
        </if>
        <if test="smallPackageUnit != null  and smallPackageUnit != ''">
            and small_package_unit = #{smallPackageUnit}
        </if>
        <if test="itemId != null ">
            and item_id = #{itemId}
        </if>
        <if test="specialDrugsCode != null  and specialDrugsCode != ''">
            and special_drugs_code = #{specialDrugsCode}
        </if>
        <if test="pinyin != null  and pinyin != ''">
            and pinyin = #{pinyin}
        </if>
        <if test="doseFormName != null  and doseFormName != ''">
            and dose_form_name like concat('%', #{doseFormName}, '%')
        </if>
        <if test="largePackageUnit != null  and largePackageUnit != ''">
            and large_package_unit = #{largePackageUnit}
        </if>
        <if test="retailPrice != null ">
            and retail_price = #{retailPrice}
        </if>
        <if test="status != null ">
            and status = #{status}
        </if>
    </select>
    <select id="selectMedicationItemById" parameterType="Long"
            resultMap="MedicationItemResult">
        <include refid="selectMedicationItemVo"/>
        where id = #{id}
    </select>
    <insert id="insertMedicationItem" parameterType="com.smartor.domain.MedicationItem" useGeneratedKeys="true"
            keyProperty="id">
        insert into medication_item
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="identificationCode != null">identification_code,
            </if>
            <if test="wbm != null">wbm,
            </if>
            <if test="medicationCommonName != null">medication_common_name,
            </if>
            <if test="manufacturerName != null">manufacturer_name,
            </if>
            <if test="itemCode != null">item_code,
            </if>
            <if test="smallLargePackageRatio != null">small_large_package_ratio,
            </if>
            <if test="remark != null">remark,
            </if>
            <if test="orgId != null">org_id,
            </if>
            <if test="itemName != null">item_name,
            </if>
            <if test="medicationType != null">medication_type,
            </if>
            <if test="antimicrobialGradeCode != null">antimicrobial_grade_code,
            </if>
            <if test="licenseNumber != null">license_number,
            </if>
            <if test="defaultUsageName != null">default_usage_name,
            </if>
            <if test="specialDrugsName != null">special_drugs_name,
            </if>
            <if test="antimicrobialGradeName != null">antimicrobial_grade_name,
            </if>
            <if test="commonPinyin != null">common_pinyin,
            </if>
            <if test="commonWbm != null">common_wbm,
            </if>
            <if test="manufacturerId != null">manufacturer_id,
            </if>
            <if test="defaultUsageId != null">default_usage_id,
            </if>
            <if test="specification != null">specification,
            </if>
            <if test="smallPackageUnit != null">small_package_unit,
            </if>
            <if test="itemId != null">item_id,
            </if>
            <if test="specialDrugsCode != null">special_drugs_code,
            </if>
            <if test="pinyin != null">pinyin,
            </if>
            <if test="doseFormName != null">dose_form_name,
            </if>
            <if test="largePackageUnit != null">large_package_unit,
            </if>
            <if test="retailPrice != null">retail_price,
            </if>
            <if test="status != null">status,
            </if>
            <if test="createBy != null">create_by,
            </if>
            <if test="createTime != null">create_time,
            </if>
            <if test="updateBy != null">update_by,
            </if>
            <if test="updateTime != null">update_time,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="identificationCode != null">#{identificationCode},
            </if>
            <if test="wbm != null">#{wbm},
            </if>
            <if test="medicationCommonName != null">#{medicationCommonName},
            </if>
            <if test="manufacturerName != null">#{manufacturerName},
            </if>
            <if test="itemCode != null">#{itemCode},
            </if>
            <if test="smallLargePackageRatio != null">#{smallLargePackageRatio},
            </if>
            <if test="remark != null">#{remark},
            </if>
            <if test="orgId != null">#{orgId},
            </if>
            <if test="itemName != null">#{itemName},
            </if>
            <if test="medicationType != null">#{medicationType},
            </if>
            <if test="antimicrobialGradeCode != null">#{antimicrobialGradeCode},
            </if>
            <if test="licenseNumber != null">#{licenseNumber},
            </if>
            <if test="defaultUsageName != null">#{defaultUsageName},
            </if>
            <if test="specialDrugsName != null">#{specialDrugsName},
            </if>
            <if test="antimicrobialGradeName != null">#{antimicrobialGradeName},
            </if>
            <if test="commonPinyin != null">#{commonPinyin},
            </if>
            <if test="commonWbm != null">#{commonWbm},
            </if>
            <if test="manufacturerId != null">#{manufacturerId},
            </if>
            <if test="defaultUsageId != null">#{defaultUsageId},
            </if>
            <if test="specification != null">#{specification},
            </if>
            <if test="smallPackageUnit != null">#{smallPackageUnit},
            </if>
            <if test="itemId != null">#{itemId},
            </if>
            <if test="specialDrugsCode != null">#{specialDrugsCode},
            </if>
            <if test="pinyin != null">#{pinyin},
            </if>
            <if test="doseFormName != null">#{doseFormName},
            </if>
            <if test="largePackageUnit != null">#{largePackageUnit},
            </if>
            <if test="retailPrice != null">#{retailPrice},
            </if>
            <if test="status != null">#{status},
            </if>
            <if test="createBy != null">#{createBy},
            </if>
            <if test="createTime != null">#{createTime},
            </if>
            <if test="updateBy != null">#{updateBy},
            </if>
            <if test="updateTime != null">#{updateTime},
            </if>
        </trim>
    </insert>
    <update id="updateMedicationItem" parameterType="com.smartor.domain.MedicationItem">
        update medication_item
        <trim prefix="SET" suffixOverrides=",">
            <if test="identificationCode != null">identification_code =
                #{identificationCode},
            </if>
            <if test="wbm != null">wbm =
                #{wbm},
            </if>
            <if test="medicationCommonName != null">medication_common_name =
                #{medicationCommonName},
            </if>
            <if test="manufacturerName != null">manufacturer_name =
                #{manufacturerName},
            </if>
            <if test="itemCode != null">item_code =
                #{itemCode},
            </if>
            <if test="smallLargePackageRatio != null">small_large_package_ratio =
                #{smallLargePackageRatio},
            </if>
            <if test="remark != null">remark =
                #{remark},
            </if>
            <if test="orgId != null">org_id =
                #{orgId},
            </if>
            <if test="itemName != null">item_name =
                #{itemName},
            </if>
            <if test="medicationType != null">medication_type =
                #{medicationType},
            </if>
            <if test="antimicrobialGradeCode != null">antimicrobial_grade_code =
                #{antimicrobialGradeCode},
            </if>
            <if test="licenseNumber != null">license_number =
                #{licenseNumber},
            </if>
            <if test="defaultUsageName != null">default_usage_name =
                #{defaultUsageName},
            </if>
            <if test="specialDrugsName != null">special_drugs_name =
                #{specialDrugsName},
            </if>
            <if test="antimicrobialGradeName != null">antimicrobial_grade_name =
                #{antimicrobialGradeName},
            </if>
            <if test="commonPinyin != null">common_pinyin =
                #{commonPinyin},
            </if>
            <if test="commonWbm != null">common_wbm =
                #{commonWbm},
            </if>
            <if test="manufacturerId != null">manufacturer_id =
                #{manufacturerId},
            </if>
            <if test="defaultUsageId != null">default_usage_id =
                #{defaultUsageId},
            </if>
            <if test="specification != null">specification =
                #{specification},
            </if>
            <if test="smallPackageUnit != null">small_package_unit =
                #{smallPackageUnit},
            </if>
            <if test="itemId != null">item_id =
                #{itemId},
            </if>
            <if test="specialDrugsCode != null">special_drugs_code =
                #{specialDrugsCode},
            </if>
            <if test="pinyin != null">pinyin =
                #{pinyin},
            </if>
            <if test="doseFormName != null">dose_form_name =
                #{doseFormName},
            </if>
            <if test="largePackageUnit != null">large_package_unit =
                #{largePackageUnit},
            </if>
            <if test="retailPrice != null">retail_price =
                #{retailPrice},
            </if>
            <if test="status != null">status =
                #{status},
            </if>
            <if test="createBy != null">create_by =
                #{createBy},
            </if>
            <if test="createTime != null">create_time =
                #{createTime},
            </if>
            <if test="updateBy != null">update_by =
                #{updateBy},
            </if>
            <if test="updateTime != null">update_time =
                #{updateTime},
            </if>
        </trim>
        where id = #{id}
    </update>
    <update id="deleteMedicationItemById" parameterType="Long">
        update medication_item
        <trim prefix="SET" suffixOverrides=",">
            del_flag =1
        </trim>
        where id = #{id}
    </update>
    <update id="deleteMedicationItemByIds" parameterType="String">
        update medication_item
        <trim prefix="SET" suffixOverrides=",">
            del_flag =1
        </trim>
        where id in
        <foreach item="id" collection="array" open="(" separator="," close=")">
            #{id}
        </foreach>
    </update>
</mapper>
smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml
@@ -76,11 +76,13 @@
        <result property="managementDoctor" column="management_doctor"/>
        <result property="managementDoctorCode" column="management_doctor_code"/>
        <result property="campusid" column="campusid"/>
        <result property="inhospMydFlag" column="inhosp_myd_flag"/>
    </resultMap>
    <sql id="selectPatMedInhospVo">
        select inhospid,
               patname,
               inhosp_myd_flag,
               campusid,
               fuflag,
               management_doctor,
@@ -216,6 +218,7 @@
        b.futypedesc,
        b.fuadvice,
        b.fuspecialadvice,
        b.inhosp_myd_flag,
        a.idcardno
        FROM
        pat_med_inhosp b
@@ -245,6 +248,7 @@
            concat('%', #{hospitaldistrictname}, '%')
        </if>
        <if test="endtime != null ">and b.endtime = #{endtime}</if>
        <if test="inhospMydFlag != null ">and b.inhosp_myd_flag = #{inhospMydFlag}</if>
        <if test="managementDoctor != null ">and b.management_doctor = #{managementDoctor}</if>
        <if test="managementDoctorCode != null ">and b.management_doctor_code = #{managementDoctorCode}</if>
        <if test="inhospno != null ">and b.inhospno = #{inhospno}</if>
@@ -409,10 +413,12 @@
        b.futypecode,
        b.futypedesc,
        b.fuadvice,
        b.inhosp_myd_flag,
        b.fuspecialadvice
        FROM
        pat_med_inhosp b
        where 1=1
        <if test="inhospMydFlag != null ">and b.inhosp_myd_flag = #{inhospMydFlag}</if>
        <if test="orgid != null and orgid != ''">
            and orgid = #{orgid}
        </if>
@@ -489,6 +495,7 @@
        b.futypedesc,
        b.fuadvice,
        b.fuspecialadvice,
        b.inhosp_myd_flag,
        b.schemetime
        FROM
        pat_med_inhosp b,
@@ -498,6 +505,7 @@
        and b.del_flag=0
        and a.id = b.patid
        AND a.idcardno != ''
        <if test="inhospMydFlag != null ">and b.inhosp_myd_flag = #{inhospMydFlag}</if>
        <if test="orgid != null and orgid != ''">
            and a.orgid = #{orgid}
        </if>
@@ -566,6 +574,7 @@
        <if test="cry != null and cry == 0 ">and inhospstate=0</if>
        <if test="cry != null and cry == 1 ">and inhospstate=1</if>
        <if test="cry != null and cry == 3 ">and inhospstate=3</if>
        <if test="inhospMydFlag != null ">and inhosp_myd_flag = #{inhospMydFlag}</if>
        <if test="serialnum != null">and serialnum = #{serialnum}</if>
        <if test="hospitalname != null">and hospitalname = #{hospitalname}</if>
        <if test="hospitalcode != null">and hospitalcode = #{hospitalcode}</if>
@@ -702,6 +711,7 @@
            <if test="managementDoctor != null ">management_doctor,</if>
            <if test="managementDoctorCode != null ">management_doctor_code,</if>
            <if test="campusid != null ">campusid,</if>
            <if test="inhospMydFlag != null ">inhosp_myd_flag,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="serialnum != null">#{serialnum},</if>
@@ -769,6 +779,7 @@
            <if test="managementDoctor != null ">#{managementDoctor},</if>
            <if test="managementDoctorCode != null ">#{managementDoctorCode},</if>
            <if test="campusid != null ">#{campusid},</if>
            <if test="inhospMydFlag != null ">#{inhospMydFlag},</if>
        </trim>
    </insert>
@@ -787,7 +798,7 @@
        nurse_id, nurse_name, out_way_id, out_way_name, guid,
        operator, operator_id, inhospno, remark,
        fuflag, fudate, fuperiod, futypecode, futypedesc, fuadvice, fuspecialadvice, management_doctor,
        management_doctor_doctor,campusid
        management_doctor_doctor,campusid, inhosp_myd_flag
        )
        values
        <foreach collection="list" item="item" separator=",">
@@ -809,7 +820,7 @@
            #{item.nurseId}, #{item.nurseName}, #{item.outWayId}, #{item.outWayName}, #{item.guid},
            #{item.operator}, #{item.operatorId}, #{item.inhospno}, #{item.remark},
            #{item.fuflag}, #{item.fudate}, #{item.fuperiod}, #{item.futypecode}, #{item.futypedesc}, #{item.fuadvice},
            #{item.fuspecialadvice}, #{item.managementDoctor}, #{item.managementDoctorCode}, #{item.campusid}
            #{item.fuspecialadvice}, #{item.managementDoctor}, #{item.managementDoctorCode}, #{item.campusid}, #{item.inhospMydFlag}
            )
        </foreach>
    </insert>
@@ -882,8 +893,8 @@
            <if test="fuspecialadvice != null ">fuspecialadvice = #{fuspecialadvice},</if>
            <if test="managementDoctor != null ">management_doctor = #{managementDoctor},</if>
            <if test="managementDoctorCode != null ">management_doctor_code = #{managementDoctorCode},</if>
            <if test="campusid != null ">campusid = #{campusid}</if>
            <if test="campusid != null ">campusid = #{campusid},</if>
            <if test="inhospMydFlag != null ">inhosp_myd_flag = #{inhospMydFlag},</if>
        </trim>
        where inhospid = #{inhospid}
    </update>
smartor/src/main/resources/mapper/smartor/ServiceAppointRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,803 @@
<?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.smartor.mapper.ServiceAppointRecordMapper">
    <resultMap type="com.smartor.domain.ServiceAppointRecord" id="ServiceAppointRecordResult">
        <result property="id" column="id"/>
        <result property="appointRecSn" column="appoint_rec_sn"/>
        <result property="changeAppointRecSn" column="change_appoint_rec_sn"/>
        <result property="orgCode" column="org_code"/>
        <result property="patFileSn" column="pat_file_sn"/>
        <result property="patMediaSn" column="pat_media_sn"/>
        <result property="patMediaNum" column="pat_media_num"/>
        <result property="patCateSn" column="pat_cate_sn"/>
        <result property="patNatureSn" column="pat_nature_sn"/>
        <result property="patFileName" column="pat_file_name"/>
        <result property="patFileGender" column="pat_file_gender"/>
        <result property="patAge" column="pat_age"/>
        <result property="patBirthday" column="pat_birthday"/>
        <result property="patCardTypeCode" column="pat_card_type_code"/>
        <result property="patCardType" column="pat_card_type"/>
        <result property="patIdCardNum" column="pat_id_card_num"/>
        <result property="patAddr" column="pat_addr"/>
        <result property="patTel" column="pat_tel"/>
        <result property="patWayCode" column="pat_way_code"/>
        <result property="patWay" column="pat_way"/>
        <result property="appointTypeSn" column="appoint_type_sn"/>
        <result property="appointDate" column="appoint_date"/>
        <result property="appointOperatorId" column="appoint_operator_id"/>
        <result property="appointOperatorName" column="appoint_operator_name"/>
        <result property="appointRegistDate" column="appoint_regist_date"/>
        <result property="registerScheduleSn" column="register_schedule_sn"/>
        <result property="outpatCateSn" column="outpat_cate_sn"/>
        <result property="outpatCateName" column="outpat_cate_name"/>
        <result property="registDeptCode" column="regist_dept_code"/>
        <result property="registDeptName" column="regist_dept_name"/>
        <result property="deptPinyinCode" column="dept_pinyin_code"/>
        <result property="registDoctCode" column="regist_doct_code"/>
        <result property="registDoctName" column="regist_doct_name"/>
        <result property="staffPinyinCode" column="staff_pinyin_code"/>
        <result property="registTimeCate" column="regist_time_cate"/>
        <result property="patiRegistSn" column="pati_regist_sn"/>
        <result property="scheduleRegistCharge" column="schedule_regist_charge"/>
        <result property="registRecSn" column="regist_rec_sn"/>
        <result property="regUserSn" column="reg_user_sn"/>
        <result property="regUserName" column="reg_user_name"/>
        <result property="regOptTime" column="reg_opt_time"/>
        <result property="revokeUserSn" column="revoke_user_sn"/>
        <result property="revokeUserName" column="revoke_user_name"/>
        <result property="revokeOptTime" column="revoke_opt_time"/>
        <result property="withdrawalTime" column="withdrawal_time"/>
        <result property="scheduleStatusFlag" column="schedule_status_flag"/>
        <result property="scheduleMemoDesc" column="schedule_memo_desc"/>
        <result property="scheduleCredenceNum" column="schedule_credence_num"/>
        <result property="registTimeRange" column="regist_time_range"/>
        <result property="scheduleDetailSn" column="schedule_detail_sn"/>
        <result property="treatDate" column="treat_date"/>
        <result property="treatDoctCode" column="treat_doct_code"/>
        <result property="treatDoctName" column="treat_doct_name"/>
        <result property="regWayCode" column="reg_way_code"/>
        <result property="regWay" column="reg_way"/>
        <result property="regSystemWayCode" column="reg_system_way_code"/>
        <result property="regSystemWay" column="reg_system_way"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="visitFlag" column="visit_flag"/>
        <result property="senderId" column="sender_id"/>
        <result property="senderName" column="sender_name"/>
        <result property="sendTime" column="send_time"/>
    </resultMap>
    <sql id="selectServiceAppointRecordVo">
        select id,
               appoint_rec_sn,
               change_appoint_rec_sn,
               org_code,
               pat_file_sn,
               pat_media_sn,
               pat_media_num,
               pat_cate_sn,
               pat_nature_sn,
               pat_file_name,
               pat_file_gender,
               pat_age,
               pat_birthday,
               pat_card_type_code,
               pat_card_type,
               pat_id_card_num,
               pat_addr,
               pat_tel,
               pat_way_code,
               pat_way,
               appoint_type_sn,
               appoint_date,
               appoint_operator_id,
               appoint_operator_name,
               appoint_regist_date,
               register_schedule_sn,
               outpat_cate_sn,
               outpat_cate_name,
               regist_dept_code,
               regist_dept_name,
               dept_pinyin_code,
               regist_doct_code,
               regist_doct_name,
               staff_pinyin_code,
               regist_time_cate,
               pati_regist_sn,
               schedule_regist_charge,
               regist_rec_sn,
               reg_user_sn,
               reg_user_name,
               reg_opt_time,
               revoke_user_sn,
               revoke_user_name,
               revoke_opt_time,
               withdrawal_time,
               schedule_status_flag,
               schedule_memo_desc,
               schedule_credence_num,
               regist_time_range,
               schedule_detail_sn,
               treat_date,
               treat_doct_code,
               treat_doct_name,
               reg_way_code,
               reg_way,
               reg_system_way_code,
               reg_system_way,
               create_time,
               update_time,
               visit_flag,
               sender_id,
               sender_name,
               send_time
        from service_appoint_record
    </sql>
    <select id="selectServiceAppointRecordList" parameterType="com.smartor.domain.ServiceAppointRecord"
            resultMap="ServiceAppointRecordResult">
        <include refid="selectServiceAppointRecordVo"/>
        where 1=1
        and del_flag=0
        <if test="appointRecSn != null  and appointRecSn != ''">
            and appoint_rec_sn = #{appointRecSn}
        </if>
        <if test="changeAppointRecSn != null  and changeAppointRecSn != ''">
            and change_appoint_rec_sn = #{changeAppointRecSn}
        </if>
        <if test="orgCode != null  and orgCode != ''">
            and org_code = #{orgCode}
        </if>
        <if test="patFileSn != null  and patFileSn != ''">
            and pat_file_sn = #{patFileSn}
        </if>
        <if test="patMediaSn != null  and patMediaSn != ''">
            and pat_media_sn = #{patMediaSn}
        </if>
        <if test="patMediaNum != null  and patMediaNum != ''">
            and pat_media_num = #{patMediaNum}
        </if>
        <if test="patCateSn != null  and patCateSn != ''">
            and pat_cate_sn = #{patCateSn}
        </if>
        <if test="patNatureSn != null  and patNatureSn != ''">
            and pat_nature_sn = #{patNatureSn}
        </if>
        <if test="patFileName != null  and patFileName != ''">
            and pat_file_name like concat('%', #{patFileName}, '%')
        </if>
        <if test="patFileGender != null  and patFileGender != ''">
            and pat_file_gender = #{patFileGender}
        </if>
        <if test="patAge != null  and patAge != ''">
            and pat_age = #{patAge}
        </if>
        <if test="patBirthday != null  and patBirthday != ''">
            and pat_birthday = #{patBirthday}
        </if>
        <if test="patCardTypeCode != null  and patCardTypeCode != ''">
            and pat_card_type_code = #{patCardTypeCode}
        </if>
        <if test="patCardType != null  and patCardType != ''">
            and pat_card_type = #{patCardType}
        </if>
        <if test="patIdCardNum != null  and patIdCardNum != ''">
            and pat_id_card_num = #{patIdCardNum}
        </if>
        <if test="patAddr != null  and patAddr != ''">
            and pat_addr = #{patAddr}
        </if>
        <if test="patTel != null  and patTel != ''">
            and pat_tel = #{patTel}
        </if>
        <if test="patWayCode != null  and patWayCode != ''">
            and pat_way_code = #{patWayCode}
        </if>
        <if test="patWay != null  and patWay != ''">
            and pat_way = #{patWay}
        </if>
        <if test="appointTypeSn != null  and appointTypeSn != ''">
            and appoint_type_sn = #{appointTypeSn}
        </if>
        <if test="appointDate != null  and appointDate != ''">
            and appoint_date = #{appointDate}
        </if>
        <if test="appointOperatorId != null  and appointOperatorId != ''">
            and appoint_operator_id = #{appointOperatorId}
        </if>
        <if test="appointOperatorName != null  and appointOperatorName != ''">
            and appoint_operator_name like concat('%', #{appointOperatorName}, '%')
        </if>
        <if test="appointRegistDate != null  and appointRegistDate != ''">
            and appoint_regist_date = #{appointRegistDate}
        </if>
        <if test="registerScheduleSn != null  and registerScheduleSn != ''">
            and register_schedule_sn = #{registerScheduleSn}
        </if>
        <if test="outpatCateSn != null  and outpatCateSn != ''">
            and outpat_cate_sn = #{outpatCateSn}
        </if>
        <if test="outpatCateName != null  and outpatCateName != ''">
            and outpat_cate_name like concat('%', #{outpatCateName}, '%')
        </if>
        <if test="registDeptCode != null  and registDeptCode != ''">
            and regist_dept_code = #{registDeptCode}
        </if>
        <if test="registDeptName != null  and registDeptName != ''">
            and regist_dept_name like concat('%', #{registDeptName}, '%')
        </if>
        <if test="deptPinyinCode != null  and deptPinyinCode != ''">
            and dept_pinyin_code = #{deptPinyinCode}
        </if>
        <if test="registDoctCode != null  and registDoctCode != ''">
            and regist_doct_code = #{registDoctCode}
        </if>
        <if test="registDoctName != null  and registDoctName != ''">
            and regist_doct_name like concat('%', #{registDoctName}, '%')
        </if>
        <if test="staffPinyinCode != null  and staffPinyinCode != ''">
            and staff_pinyin_code = #{staffPinyinCode}
        </if>
        <if test="registTimeCate != null ">
            and regist_time_cate = #{registTimeCate}
        </if>
        <if test="patiRegistSn != null ">
            and pati_regist_sn = #{patiRegistSn}
        </if>
        <if test="scheduleRegistCharge != null ">
            and schedule_regist_charge = #{scheduleRegistCharge}
        </if>
        <if test="registRecSn != null  and registRecSn != ''">
            and regist_rec_sn = #{registRecSn}
        </if>
        <if test="regUserSn != null  and regUserSn != ''">
            and reg_user_sn = #{regUserSn}
        </if>
        <if test="regUserName != null  and regUserName != ''">
            and reg_user_name like concat('%', #{regUserName}, '%')
        </if>
        <if test="regOptTime != null  and regOptTime != ''">
            and reg_opt_time = #{regOptTime}
        </if>
        <if test="revokeUserSn != null  and revokeUserSn != ''">
            and revoke_user_sn = #{revokeUserSn}
        </if>
        <if test="revokeUserName != null  and revokeUserName != ''">
            and revoke_user_name like concat('%', #{revokeUserName}, '%')
        </if>
        <if test="revokeOptTime != null  and revokeOptTime != ''">
            and revoke_opt_time = #{revokeOptTime}
        </if>
        <if test="withdrawalTime != null  and withdrawalTime != ''">
            and withdrawal_time = #{withdrawalTime}
        </if>
        <if test="scheduleStatusFlag != null ">
            and schedule_status_flag = #{scheduleStatusFlag}
        </if>
        <if test="scheduleMemoDesc != null  and scheduleMemoDesc != ''">
            and schedule_memo_desc = #{scheduleMemoDesc}
        </if>
        <if test="scheduleCredenceNum != null  and scheduleCredenceNum != ''">
            and schedule_credence_num = #{scheduleCredenceNum}
        </if>
        <if test="registTimeRange != null  and registTimeRange != ''">
            and regist_time_range = #{registTimeRange}
        </if>
        <if test="scheduleDetailSn != null  and scheduleDetailSn != ''">
            and schedule_detail_sn = #{scheduleDetailSn}
        </if>
        <if test="treatDate != null  and treatDate != ''">
            and treat_date = #{treatDate}
        </if>
        <if test="treatDoctCode != null  and treatDoctCode != ''">
            and treat_doct_code = #{treatDoctCode}
        </if>
        <if test="treatDoctName != null  and treatDoctName != ''">
            and treat_doct_name like concat('%', #{treatDoctName}, '%')
        </if>
        <if test="regWayCode != null  and regWayCode != ''">
            and reg_way_code = #{regWayCode}
        </if>
        <if test="regWay != null  and regWay != ''">
            and reg_way = #{regWay}
        </if>
        <if test="regSystemWayCode != null  and regSystemWayCode != ''">
            and reg_system_way_code = #{regSystemWayCode}
        </if>
        <if test="regSystemWay != null  and regSystemWay != ''">
            and reg_system_way = #{regSystemWay}
        </if>
        <if test="visitFlag != null ">
            and visit_flag = #{visitFlag}
        </if>
        <if test="senderId != null  and senderId != ''">
            and sender_id = #{senderId}
        </if>
        <if test="senderName != null  and senderName != ''">
            and sender_name like concat('%', #{senderName}, '%')
        </if>
        <if test="sendTime != null  and sendTime != ''">
            and send_time = #{sendTime}
        </if>
    </select>
    <select id="selectServiceAppointRecordById" parameterType="Long"
            resultMap="ServiceAppointRecordResult">
        <include refid="selectServiceAppointRecordVo"/>
        where id = #{id}
    </select>
    <insert id="insertServiceAppointRecord" parameterType="com.smartor.domain.ServiceAppointRecord"
            useGeneratedKeys="true" keyProperty="id">
        insert into service_appoint_record
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="appointRecSn != null">appoint_rec_sn,
            </if>
            <if test="changeAppointRecSn != null">change_appoint_rec_sn,
            </if>
            <if test="orgCode != null">org_code,
            </if>
            <if test="patFileSn != null">pat_file_sn,
            </if>
            <if test="patMediaSn != null">pat_media_sn,
            </if>
            <if test="patMediaNum != null">pat_media_num,
            </if>
            <if test="patCateSn != null">pat_cate_sn,
            </if>
            <if test="patNatureSn != null">pat_nature_sn,
            </if>
            <if test="patFileName != null">pat_file_name,
            </if>
            <if test="patFileGender != null">pat_file_gender,
            </if>
            <if test="patAge != null">pat_age,
            </if>
            <if test="patBirthday != null">pat_birthday,
            </if>
            <if test="patCardTypeCode != null">pat_card_type_code,
            </if>
            <if test="patCardType != null">pat_card_type,
            </if>
            <if test="patIdCardNum != null">pat_id_card_num,
            </if>
            <if test="patAddr != null">pat_addr,
            </if>
            <if test="patTel != null">pat_tel,
            </if>
            <if test="patWayCode != null">pat_way_code,
            </if>
            <if test="patWay != null">pat_way,
            </if>
            <if test="appointTypeSn != null">appoint_type_sn,
            </if>
            <if test="appointDate != null">appoint_date,
            </if>
            <if test="appointOperatorId != null">appoint_operator_id,
            </if>
            <if test="appointOperatorName != null">appoint_operator_name,
            </if>
            <if test="appointRegistDate != null">appoint_regist_date,
            </if>
            <if test="registerScheduleSn != null">register_schedule_sn,
            </if>
            <if test="outpatCateSn != null">outpat_cate_sn,
            </if>
            <if test="outpatCateName != null">outpat_cate_name,
            </if>
            <if test="registDeptCode != null">regist_dept_code,
            </if>
            <if test="registDeptName != null">regist_dept_name,
            </if>
            <if test="deptPinyinCode != null">dept_pinyin_code,
            </if>
            <if test="registDoctCode != null">regist_doct_code,
            </if>
            <if test="registDoctName != null">regist_doct_name,
            </if>
            <if test="staffPinyinCode != null">staff_pinyin_code,
            </if>
            <if test="registTimeCate != null">regist_time_cate,
            </if>
            <if test="patiRegistSn != null">pati_regist_sn,
            </if>
            <if test="scheduleRegistCharge != null">schedule_regist_charge,
            </if>
            <if test="registRecSn != null">regist_rec_sn,
            </if>
            <if test="regUserSn != null">reg_user_sn,
            </if>
            <if test="regUserName != null">reg_user_name,
            </if>
            <if test="regOptTime != null">reg_opt_time,
            </if>
            <if test="revokeUserSn != null">revoke_user_sn,
            </if>
            <if test="revokeUserName != null">revoke_user_name,
            </if>
            <if test="revokeOptTime != null">revoke_opt_time,
            </if>
            <if test="withdrawalTime != null">withdrawal_time,
            </if>
            <if test="scheduleStatusFlag != null">schedule_status_flag,
            </if>
            <if test="scheduleMemoDesc != null">schedule_memo_desc,
            </if>
            <if test="scheduleCredenceNum != null">schedule_credence_num,
            </if>
            <if test="registTimeRange != null">regist_time_range,
            </if>
            <if test="scheduleDetailSn != null">schedule_detail_sn,
            </if>
            <if test="treatDate != null">treat_date,
            </if>
            <if test="treatDoctCode != null">treat_doct_code,
            </if>
            <if test="treatDoctName != null">treat_doct_name,
            </if>
            <if test="regWayCode != null">reg_way_code,
            </if>
            <if test="regWay != null">reg_way,
            </if>
            <if test="regSystemWayCode != null">reg_system_way_code,
            </if>
            <if test="regSystemWay != null">reg_system_way,
            </if>
            <if test="createTime != null">create_time,
            </if>
            <if test="updateTime != null">update_time,
            </if>
            <if test="visitFlag != null">visit_flag,
            </if>
            <if test="senderId != null">sender_id,
            </if>
            <if test="senderName != null">sender_name,
            </if>
            <if test="sendTime != null">send_time,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="appointRecSn != null">#{appointRecSn},
            </if>
            <if test="changeAppointRecSn != null">#{changeAppointRecSn},
            </if>
            <if test="orgCode != null">#{orgCode},
            </if>
            <if test="patFileSn != null">#{patFileSn},
            </if>
            <if test="patMediaSn != null">#{patMediaSn},
            </if>
            <if test="patMediaNum != null">#{patMediaNum},
            </if>
            <if test="patCateSn != null">#{patCateSn},
            </if>
            <if test="patNatureSn != null">#{patNatureSn},
            </if>
            <if test="patFileName != null">#{patFileName},
            </if>
            <if test="patFileGender != null">#{patFileGender},
            </if>
            <if test="patAge != null">#{patAge},
            </if>
            <if test="patBirthday != null">#{patBirthday},
            </if>
            <if test="patCardTypeCode != null">#{patCardTypeCode},
            </if>
            <if test="patCardType != null">#{patCardType},
            </if>
            <if test="patIdCardNum != null">#{patIdCardNum},
            </if>
            <if test="patAddr != null">#{patAddr},
            </if>
            <if test="patTel != null">#{patTel},
            </if>
            <if test="patWayCode != null">#{patWayCode},
            </if>
            <if test="patWay != null">#{patWay},
            </if>
            <if test="appointTypeSn != null">#{appointTypeSn},
            </if>
            <if test="appointDate != null">#{appointDate},
            </if>
            <if test="appointOperatorId != null">#{appointOperatorId},
            </if>
            <if test="appointOperatorName != null">#{appointOperatorName},
            </if>
            <if test="appointRegistDate != null">#{appointRegistDate},
            </if>
            <if test="registerScheduleSn != null">#{registerScheduleSn},
            </if>
            <if test="outpatCateSn != null">#{outpatCateSn},
            </if>
            <if test="outpatCateName != null">#{outpatCateName},
            </if>
            <if test="registDeptCode != null">#{registDeptCode},
            </if>
            <if test="registDeptName != null">#{registDeptName},
            </if>
            <if test="deptPinyinCode != null">#{deptPinyinCode},
            </if>
            <if test="registDoctCode != null">#{registDoctCode},
            </if>
            <if test="registDoctName != null">#{registDoctName},
            </if>
            <if test="staffPinyinCode != null">#{staffPinyinCode},
            </if>
            <if test="registTimeCate != null">#{registTimeCate},
            </if>
            <if test="patiRegistSn != null">#{patiRegistSn},
            </if>
            <if test="scheduleRegistCharge != null">#{scheduleRegistCharge},
            </if>
            <if test="registRecSn != null">#{registRecSn},
            </if>
            <if test="regUserSn != null">#{regUserSn},
            </if>
            <if test="regUserName != null">#{regUserName},
            </if>
            <if test="regOptTime != null">#{regOptTime},
            </if>
            <if test="revokeUserSn != null">#{revokeUserSn},
            </if>
            <if test="revokeUserName != null">#{revokeUserName},
            </if>
            <if test="revokeOptTime != null">#{revokeOptTime},
            </if>
            <if test="withdrawalTime != null">#{withdrawalTime},
            </if>
            <if test="scheduleStatusFlag != null">#{scheduleStatusFlag},
            </if>
            <if test="scheduleMemoDesc != null">#{scheduleMemoDesc},
            </if>
            <if test="scheduleCredenceNum != null">#{scheduleCredenceNum},
            </if>
            <if test="registTimeRange != null">#{registTimeRange},
            </if>
            <if test="scheduleDetailSn != null">#{scheduleDetailSn},
            </if>
            <if test="treatDate != null">#{treatDate},
            </if>
            <if test="treatDoctCode != null">#{treatDoctCode},
            </if>
            <if test="treatDoctName != null">#{treatDoctName},
            </if>
            <if test="regWayCode != null">#{regWayCode},
            </if>
            <if test="regWay != null">#{regWay},
            </if>
            <if test="regSystemWayCode != null">#{regSystemWayCode},
            </if>
            <if test="regSystemWay != null">#{regSystemWay},
            </if>
            <if test="createTime != null">#{createTime},
            </if>
            <if test="updateTime != null">#{updateTime},
            </if>
            <if test="visitFlag != null">#{visitFlag},
            </if>
            <if test="senderId != null">#{senderId},
            </if>
            <if test="senderName != null">#{senderName},
            </if>
            <if test="sendTime != null">#{sendTime},
            </if>
        </trim>
    </insert>
    <update id="updateServiceAppointRecord" parameterType="com.smartor.domain.ServiceAppointRecord">
        update service_appoint_record
        <trim prefix="SET" suffixOverrides=",">
            <if test="appointRecSn != null">appoint_rec_sn =
                #{appointRecSn},
            </if>
            <if test="changeAppointRecSn != null">change_appoint_rec_sn =
                #{changeAppointRecSn},
            </if>
            <if test="orgCode != null">org_code =
                #{orgCode},
            </if>
            <if test="patFileSn != null">pat_file_sn =
                #{patFileSn},
            </if>
            <if test="patMediaSn != null">pat_media_sn =
                #{patMediaSn},
            </if>
            <if test="patMediaNum != null">pat_media_num =
                #{patMediaNum},
            </if>
            <if test="patCateSn != null">pat_cate_sn =
                #{patCateSn},
            </if>
            <if test="patNatureSn != null">pat_nature_sn =
                #{patNatureSn},
            </if>
            <if test="patFileName != null">pat_file_name =
                #{patFileName},
            </if>
            <if test="patFileGender != null">pat_file_gender =
                #{patFileGender},
            </if>
            <if test="patAge != null">pat_age =
                #{patAge},
            </if>
            <if test="patBirthday != null">pat_birthday =
                #{patBirthday},
            </if>
            <if test="patCardTypeCode != null">pat_card_type_code =
                #{patCardTypeCode},
            </if>
            <if test="patCardType != null">pat_card_type =
                #{patCardType},
            </if>
            <if test="patIdCardNum != null">pat_id_card_num =
                #{patIdCardNum},
            </if>
            <if test="patAddr != null">pat_addr =
                #{patAddr},
            </if>
            <if test="patTel != null">pat_tel =
                #{patTel},
            </if>
            <if test="patWayCode != null">pat_way_code =
                #{patWayCode},
            </if>
            <if test="patWay != null">pat_way =
                #{patWay},
            </if>
            <if test="appointTypeSn != null">appoint_type_sn =
                #{appointTypeSn},
            </if>
            <if test="appointDate != null">appoint_date =
                #{appointDate},
            </if>
            <if test="appointOperatorId != null">appoint_operator_id =
                #{appointOperatorId},
            </if>
            <if test="appointOperatorName != null">appoint_operator_name =
                #{appointOperatorName},
            </if>
            <if test="appointRegistDate != null">appoint_regist_date =
                #{appointRegistDate},
            </if>
            <if test="registerScheduleSn != null">register_schedule_sn =
                #{registerScheduleSn},
            </if>
            <if test="outpatCateSn != null">outpat_cate_sn =
                #{outpatCateSn},
            </if>
            <if test="outpatCateName != null">outpat_cate_name =
                #{outpatCateName},
            </if>
            <if test="registDeptCode != null">regist_dept_code =
                #{registDeptCode},
            </if>
            <if test="registDeptName != null">regist_dept_name =
                #{registDeptName},
            </if>
            <if test="deptPinyinCode != null">dept_pinyin_code =
                #{deptPinyinCode},
            </if>
            <if test="registDoctCode != null">regist_doct_code =
                #{registDoctCode},
            </if>
            <if test="registDoctName != null">regist_doct_name =
                #{registDoctName},
            </if>
            <if test="staffPinyinCode != null">staff_pinyin_code =
                #{staffPinyinCode},
            </if>
            <if test="registTimeCate != null">regist_time_cate =
                #{registTimeCate},
            </if>
            <if test="patiRegistSn != null">pati_regist_sn =
                #{patiRegistSn},
            </if>
            <if test="scheduleRegistCharge != null">schedule_regist_charge =
                #{scheduleRegistCharge},
            </if>
            <if test="registRecSn != null">regist_rec_sn =
                #{registRecSn},
            </if>
            <if test="regUserSn != null">reg_user_sn =
                #{regUserSn},
            </if>
            <if test="regUserName != null">reg_user_name =
                #{regUserName},
            </if>
            <if test="regOptTime != null">reg_opt_time =
                #{regOptTime},
            </if>
            <if test="revokeUserSn != null">revoke_user_sn =
                #{revokeUserSn},
            </if>
            <if test="revokeUserName != null">revoke_user_name =
                #{revokeUserName},
            </if>
            <if test="revokeOptTime != null">revoke_opt_time =
                #{revokeOptTime},
            </if>
            <if test="withdrawalTime != null">withdrawal_time =
                #{withdrawalTime},
            </if>
            <if test="scheduleStatusFlag != null">schedule_status_flag =
                #{scheduleStatusFlag},
            </if>
            <if test="scheduleMemoDesc != null">schedule_memo_desc =
                #{scheduleMemoDesc},
            </if>
            <if test="scheduleCredenceNum != null">schedule_credence_num =
                #{scheduleCredenceNum},
            </if>
            <if test="registTimeRange != null">regist_time_range =
                #{registTimeRange},
            </if>
            <if test="scheduleDetailSn != null">schedule_detail_sn =
                #{schedDetailSn},
            </if>
            <if test="treatDate != null">treat_date =
                #{treatDate},
            </if>
            <if test="treatDoctCode != null">treat_doct_code =
                #{treatDoctCode},
            </if>
            <if test="treatDoctName != null">treat_doct_name =
                #{treatDoctName},
            </if>
            <if test="regWayCode != null">reg_way_code =
                #{regWayCode},
            </if>
            <if test="regWay != null">reg_way =
                #{regWay},
            </if>
            <if test="regSystemWayCode != null">reg_system_way_code =
                #{regSystemWayCode},
            </if>
            <if test="regSystemWay != null">reg_system_way =
                #{regSystemWay},
            </if>
            <if test="createTime != null">create_time =
                #{createTime},
            </if>
            <if test="updateTime != null">update_time =
                #{updateTime},
            </if>
            <if test="visitFlag != null">visit_flag =
                #{visitFlag},
            </if>
            <if test="senderId != null">sender_id =
                #{senderId},
            </if>
            <if test="senderName != null">sender_name =
                #{senderName},
            </if>
            <if test="sendTime != null">send_time =
                #{sendTime},
            </if>
        </trim>
        where id = #{id}
    </update>
    <update id="deleteServiceAppointRecordById" parameterType="Long">
        update service_appoint_record
        <trim prefix="SET" suffixOverrides=",">
            del_flag =1
        </trim>
        where id = #{id}
    </update>
    <update id="deleteServiceAppointRecordByIds" parameterType="String">
        update service_appoint_record
        <trim prefix="SET" suffixOverrides=",">
            del_flag =1
        </trim>
        where id in
        <foreach item="id" collection="array" open="(" separator="," close=")">
            #{id}
        </foreach>
    </update>
</mapper>
smartor/src/main/resources/mapper/smartor/ServiceOutPathMapper.xml
@@ -17,6 +17,11 @@
        <result property="radix" column="radix"/>
        <result property="guid" column="guid"/>
        <result property="orgid" column="orgid"/>
        <result property="url" column="url"/>
        <result property="wardCode" column="ward_code"/>
        <result property="wardName" column="ward_name"/>
        <result property="deptCode" column="dept_code"/>
        <result property="deptName" column="dept_name"/>
    </resultMap>
    <sql id="selectServiceOutPathVo">
@@ -31,6 +36,11 @@
               radix,
               guid,
               orgid,
               url,
               ward_code,
               ward_name,
               dept_code,
               dept_name,
               del_flag
        from service_out_path
    </sql>
@@ -61,7 +71,22 @@
        <if test="radix != null  and radix != ''">
            and radix=#{radix}
        </if>
        <if test="url != null  and url != ''">
            and url=#{url}
        </if>
        <if test="wardCode != null  and wardCode != ''">
            and ward_code=#{wardCode}
        </if>
        <if test="wardName != null  and wardName != ''">
            and ward_name=#{wardName}
        </if>
        <if test="deptCode != null  and deptCode != ''">
            and dept_code=#{deptCode}
        </if>
        <if test="deptName != null  and deptName != ''">
            and dept_name=#{deptName}
        </if>
    </select>
    <select id="selectServiceOutPathById" parameterType="Long"
@@ -90,6 +115,16 @@
            </if>
            <if test="createTime != null">create_time,
            </if>
            <if test="url != null">url,
            </if>
            <if test="wardCode != null">ward_code,
            </if>
            <if test="wardName != null">ward_name,
            </if>
            <if test="deptCode != null">dept_code,
            </if>
            <if test="deptName != null">dept_name,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -108,6 +143,16 @@
            <if test="orgid != null">#{orgid},
            </if>
            <if test="createTime != null">#{createTime},
            </if>
            <if test="url != null">#{url},
            </if>
            <if test="wardCode != null">#{wardCode},
            </if>
            <if test="wardName != null">#{wardName},
            </if>
            <if test="deptCode != null">#{deptCode},
            </if>
            <if test="deptName != null">#{deptName},
            </if>
        </trim>
    </insert>
@@ -139,6 +184,24 @@
            <if test="orgid != null">orgid =
                #{orgid},
            </if>
            <if test="updateTime != null">update_time =
                #{updateTime},
            </if>
            <if test="url != null">url =
                #{url},
            </if>
            <if test="wardCode != null">ward_code =
                #{wardCode},
            </if>
            <if test="wardName != null">ward_name =
                #{wardName},
            </if>
            <if test="deptCode != null">dept_code =
                #{deptCode},
            </if>
            <if test="deptName != null">dept_name =
                #{deptName},
            </if>
        </trim>
        where id = #{id}
    </update>
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -363,7 +363,7 @@
                #{state}
            </foreach>
        </if>
        <if test="subIdList != null  and sendstates.size() > 0">
        <if test="subIdList != null  and subIdList.size() > 0">
            AND id IN
            <foreach collection="subIdList" item="subId" open="(" separator="," close=")">
                #{subId}
@@ -393,7 +393,6 @@
        <if test="endSendDateTime != null">
            AND date_format(visit_time,'%y%m%d') &lt;= date_format(#{endSendDateTime},'%y%m%d')
        </if>
        <if test="longSendTime != null">
            AND date_format(long_send_time,'%y%m%d') &lt;= date_format(#{longSendTime},'%y%m%d')
        </if>
@@ -430,7 +429,8 @@
                         close=")">
                    #{leaveldeptcode}
                </foreach>
            </if>)
            </if>
            )
        </if>
        <if test="deptOrDistrict==3">
            AND (1=1
@@ -451,7 +451,6 @@
            </if>
            )
        </if>
        <if test="deptOrDistrict==4">
            AND (1=1
            <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
@@ -471,7 +470,6 @@
            </if>
            )
        </if>
        <if test="visitTime != null">
            AND date_format(visit_time,'%y%m%d') = date_format(#{visitTime},'%y%m%d')
        </if>
@@ -502,7 +500,6 @@
        <if test="libtemplateid != null ">and libtemplateid = #{libtemplateid}</if>
        <if test="libtemplatename != null ">and libtemplatename = #{libtemplatename}</if>
        <if test="openid != null ">and openid = #{openid}</if>
        <if test="longSendTime != null ">and long_send_time = #{longSendTime}</if>
        <if test="sendstate != null ">and sendstate = #{sendstate}</if>
        <if test="drname != null  and drname != ''">and drname like concat('%', #{drname}, '%')</if>
        <if test="taskName != null  and taskName != ''">and task_name like concat('%', #{taskName}, '%')</if>
@@ -1372,7 +1369,13 @@
            <if test="continueTimeNext != null ">continue_time_next = #{continueTimeNext,jdbcType=TIMESTAMP},</if>
            <if test="continueContent != null ">continue_content = #{continueContent},</if>
        </trim>
        where patid = #{patid} and taskid = #{taskid}
        where
        <if test="patid != null ">
            patid = #{patid}
        </if>
        <if test="taskid != null ">
            and taskid = #{taskid}
        </if>
        <if test="id != null ">
            and id = #{id}
        </if>
@@ -2528,8 +2531,8 @@
        SUM(CASE WHEN excep IS NOT NULL AND excep = '2' THEN 1 ELSE 0 END) AS jg,
        COUNT(1) as total
        FROM service_subtask
        where 1=1
        and del_flag = 0
        where del_flag = 0
        <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if>
        <if test="sendname != null and sendname != ''">
            AND sendname LIKE CONCAT('%', #{sendname}, '%')
        </if>
@@ -3059,6 +3062,12 @@
            #{taskId}
        </foreach>
        AND s.sendstate = 6
      <if test="startOutHospTime != null">
        AND date_format(s.endtime,'%y%m%d') &gt;= date_format(#{startOutHospTime},'%y%m%d')
    </if>
        <if test="endOutHospTime != null">
            AND date_format(s.endtime,'%y%m%d') &lt;= date_format(#{endOutHospTime},'%y%m%d')
        </if>
        GROUP BY
        t.taskid,
        d.questiontext,
smartor/src/main/resources/mapper/smartor/ServiceTaskMapper.xml
@@ -389,20 +389,34 @@
        <if test="leavehospitaldistrictname != null  ">and service_task.leavehospitaldistrictname =
            #{leavehospitaldistrictname}
        </if>
        <if test="leavehospitaldistrictcodes!=null and leavehospitaldistrictcodes.size()>0">
            AND service_task.leavehospitaldistrictcode IN
            <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
                     close=")">
                #{leavehospitaldistrictcode}
            </foreach>
        </if>
        <if test="leaveldeptcodes!=null and leaveldeptcodes.size()>0">
            AND service_task.deptcode IN
            <foreach collection="leaveldeptcodes" item="deptcode" open="(" separator=","
                     close=")">
                #{deptcode}
            </foreach>
        </if>
        <choose>
            <when test="(leavehospitaldistrictcodes!=null and leavehospitaldistrictcodes.size()>0) and (leaveldeptcodes!=null and leaveldeptcodes.size()>0)">
                AND (
                    service_task.leavehospitaldistrictcode IN
                    <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," close=")">
                        #{leavehospitaldistrictcode}
                    </foreach>
                    OR service_task.deptcode IN
                    <foreach collection="leaveldeptcodes" item="deptcode" open="(" separator="," close=")">
                        #{deptcode}
                    </foreach>
                )
            </when>
            <otherwise>
                <if test="leavehospitaldistrictcodes!=null and leavehospitaldistrictcodes.size()>0">
                    AND service_task.leavehospitaldistrictcode IN
                    <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," close=")">
                        #{leavehospitaldistrictcode}
                    </foreach>
                </if>
                <if test="leaveldeptcodes!=null and leaveldeptcodes.size()>0">
                    AND service_task.deptcode IN
                    <foreach collection="leaveldeptcodes" item="deptcode" open="(" separator="," close=")">
                        #{deptcode}
                    </foreach>
                </if>
            </otherwise>
        </choose>
        <if test="leavehospitaldistrictcode != null  ">and service_task.leavehospitaldistrictcode =
            #{leavehospitaldistrictcode}
        </if>
smartor/src/main/resources/mapper/smartor/SysUserDeptMapper.xml
@@ -234,7 +234,9 @@
            del_flag =1,
            update_time = sysdate()
        </trim>
        where user_id =#{userId} and dept_code=#{deptCode}
        where del_flag = 0
            and user_id =#{userId}
            and dept_code=#{deptCode}
    </update>
    <update id="updateSysUserDeptForSync" parameterType="com.ruoyi.common.core.domain.entity.SysUserDept">