浏览代码

商城处方医生开方功能

cgp 3 天之前
父节点
当前提交
d3ee26f98f

+ 46 - 7
fs-doctor-app/src/main/java/com/fs/app/controller/FsPrescribeDataScrmController.java

@@ -10,10 +10,7 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.his.domain.FsPrescribeDataScrm;
-import com.fs.his.dto.BeforePrescribeAddDoctorAdviceDTO;
-import com.fs.his.dto.FsPrescribeDataDoctorQueryDto;
-import com.fs.his.dto.FsPrescribeDataDoctorUpdateDto;
-import com.fs.his.dto.FsPrescribeDataDrugDoctorQueryDto;
+import com.fs.his.dto.*;
 import com.fs.his.service.IFsPrescribeDataScrmService;
 import com.fs.his.vo.DoctorSignVO;
 import com.fs.qw.vo.FsPrescribeDataScrmVO;
@@ -64,7 +61,7 @@ public class FsPrescribeDataScrmController extends BaseController
     }
 
     /**
-     * 获取处方表(SCRM)详细信息
+     * 获取商城处方表(SCRM)详细信息
      */
     @GetMapping(value = "/{prescribeId}")
     public AjaxResult getInfo(@PathVariable("prescribeId") Long prescribeId)
@@ -144,8 +141,50 @@ public class FsPrescribeDataScrmController extends BaseController
      * */
     @PostMapping("/addDoctorAdvice")
     public AjaxResult addDoctorAdvice(@RequestBody BeforePrescribeAddDoctorAdviceDTO addDoctorAdviceDTO){
-        int count=fsPrescribeScrmService.addDoctorAdvice(addDoctorAdviceDTO);
-        if (count>0){
+        int result=fsPrescribeScrmService.addDoctorAdvice(addDoctorAdviceDTO);
+        if (result>0){
+            return AjaxResult.success();
+        }
+        return AjaxResult.error("网络错误,提交失败");
+    }
+
+    /**
+     * 更新处方部分基本信息(诊断、医嘱、过敏史等),不改变状态
+     */
+    @PutMapping("/submitBasicInfo")
+    public AjaxResult submitBasicInfo(@RequestBody FsPrescribeDataBasicInfoDto basicInfoDto) {
+        String doctorId = getDoctorId();
+        if (StringUtils.isBlank(doctorId)) {
+            throw new CustomException("登录已过期,请重新登录");
+        }
+        int result = fsPrescribeScrmService.updateBasicInfo(basicInfoDto);
+        return result > 0 ? AjaxResult.success() : AjaxResult.error("网络错误,提交失败");
+    }
+
+    /**
+     * 最终提交处方(确认开方),包含药品列表
+     */
+    @PostMapping("/submitPrescribe")
+    public AjaxResult submitPrescribe(@RequestBody FsPrescribeDataSubmitDto submitDto) {
+        String doctorId = getDoctorId();
+        if (StringUtils.isBlank(doctorId)) {
+            throw new CustomException("登录已过期,请重新登录");
+        }
+        int result = fsPrescribeScrmService.submitPrescribe(submitDto);
+        return result > 0 ? AjaxResult.success() : AjaxResult.error("网络错误,提交失败");
+    }
+
+    /**
+     * 商城处方-医生执行拒方
+     * */
+    @PostMapping("/doctorRejectScrmPrescribe")
+    public AjaxResult doctorExecuteScrmPrescribe(@RequestBody FsPrescribeDataDoctorUpdateDto updateDto){
+        String doctorId = getDoctorId();
+        if (StringUtils.isBlank(doctorId)){
+            throw new CustomException("登录已过期,请重新登录");
+        }
+        int result=fsPrescribeScrmService.doctorRejectScrmPrescribe(updateDto);
+        if (result>0){
             return AjaxResult.success();
         }
         return AjaxResult.error("网络错误,提交失败");

+ 95 - 0
fs-doctor-app/src/main/java/com/fs/app/controller/FsPrescribeDrugDataScrmController.java

@@ -0,0 +1,95 @@
+package com.fs.app.controller;
+
+import com.fs.app.utils.JwtUtils;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.his.domain.FsPrescribeDrugDataScrm;
+import com.fs.his.service.IFsPrescribeDrugDataScrmService;
+import io.jsonwebtoken.Claims;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 商城处方药品表Controller
+ * 
+ * @author ruoyi
+ * @date 2026-06-15
+ */
+@RestController
+@RequestMapping("/his/prescribeDrugDataScrm")
+public class FsPrescribeDrugDataScrmController extends BaseController {
+    @Autowired
+    private IFsPrescribeDrugDataScrmService fsPrescribeDrugDataScrmService;
+
+
+    @Autowired
+    JwtUtils jwtUtils;
+    /**
+     * 查询处方药品表列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(FsPrescribeDrugDataScrm fsPrescribeDrugDataScrm) {
+        startPage();
+        List<FsPrescribeDrugDataScrm> list = fsPrescribeDrugDataScrmService.selectFsPrescribeDrugDataScrmList(fsPrescribeDrugDataScrm);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出处方药品表列表
+     */
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, FsPrescribeDrugDataScrm fsPrescribeDrugDataScrm) throws IOException {
+        List<FsPrescribeDrugDataScrm> list = fsPrescribeDrugDataScrmService.selectFsPrescribeDrugDataScrmList(fsPrescribeDrugDataScrm);
+        ExcelUtil<FsPrescribeDrugDataScrm> util = new ExcelUtil<>(FsPrescribeDrugDataScrm.class);
+        util.exportExcel(response, list, "处方药品表数据");
+    }
+
+    /**
+     * 获取处方药品表详细信息
+     */
+    @GetMapping(value = "/{drugId}")
+    public AjaxResult getInfo(@PathVariable("drugId") Long drugId) {
+        return AjaxResult.success(fsPrescribeDrugDataScrmService.selectFsPrescribeDrugDataScrmById(drugId));
+    }
+
+    /**
+     * 新增处方药品表
+     */
+    @PostMapping
+    public AjaxResult add(@RequestBody FsPrescribeDrugDataScrm fsPrescribeDrugDataScrm) {
+        return toAjax(fsPrescribeDrugDataScrmService.insertFsPrescribeDrugDataScrm(fsPrescribeDrugDataScrm));
+    }
+
+    /**
+     * 修改处方药品表
+     */
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsPrescribeDrugDataScrm fsPrescribeDrugDataScrm) {
+        return toAjax(fsPrescribeDrugDataScrmService.updateFsPrescribeDrugDataScrm(fsPrescribeDrugDataScrm));
+    }
+
+    /**
+     * 删除处方药品表
+     */
+    @DeleteMapping("/{drugIds}")
+    public AjaxResult remove(@PathVariable Long[] drugIds) {
+        return toAjax(fsPrescribeDrugDataScrmService.deleteFsPrescribeDrugDataScrmByIds(drugIds));
+    }
+
+    /**
+     * 获取当前登录医生id
+     * */
+    private String getDoctorId()
+    {
+        String headValue =  ServletUtils.getRequest().getHeader("APPToken");
+        Claims claims=jwtUtils.getClaimByToken(headValue);
+        String doctorId = claims.getSubject().toString();
+        return doctorId;
+    }
+}

+ 76 - 0
fs-service/src/main/java/com/fs/his/domain/FsPrescribeDrugDataScrm.java

@@ -0,0 +1,76 @@
+package com.fs.his.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 处方药品表实体类
+ * 
+ * @author ruoyi
+ * @date 2026-06-15
+ */
+@Data
+@ApiModel(description = "商城处方药品表")
+public class FsPrescribeDrugDataScrm implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "ID")
+    private Long drugId;
+
+    @ApiModelProperty(value = "处方ID")
+    private Long prescribeId;
+
+    @ApiModelProperty(value = "药品名称")
+    private String drugName;
+
+    @ApiModelProperty(value = "规格")
+    private String drugSpec;
+
+    @ApiModelProperty(value = "使用方法")
+    private String usageMethod;
+
+    @ApiModelProperty(value = "药品频次")
+    private String usageFrequencyUnit;
+
+    @ApiModelProperty(value = "每次用药数量")
+    private String usagePerUseCount;
+
+    @ApiModelProperty(value = "每次用药单位")
+    private String usagePerUseUnit;
+
+    @ApiModelProperty(value = "天数")
+    private String usageDays;
+
+    @ApiModelProperty(value = "药品价格")
+    private BigDecimal drugPrice;
+
+    @ApiModelProperty(value = "药品数量")
+    private Integer drugNum;
+
+    @ApiModelProperty(value = "药品数量单位")
+    private String drugUnit;
+
+    @ApiModelProperty(value = "药品说明书")
+    private String instructions;
+
+    @ApiModelProperty(value = "产品ID")
+    private Long productId;
+
+    @ApiModelProperty(value = "药品图片")
+    private String drugImgUrl;
+
+    @ApiModelProperty(value = "规格ID")
+    private Long productAttrValueId;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "药品类型:1西药 2中药")
+    private Integer drugType;
+
+    @ApiModelProperty(value = "是否药品(1:是,0:不是)")
+    private Integer isDrug;
+}

+ 5 - 0
fs-service/src/main/java/com/fs/his/dto/BeforePrescribeAddDoctorAdviceDTO.java

@@ -20,6 +20,11 @@ public class BeforePrescribeAddDoctorAdviceDTO {
      * */
     private String facialDiagnosis;
 
+    /**
+     * 饮食运动建议
+     * */
+    private String foodAndExerciseGuidance;
+
     /**
      * 治疗方面
      * */

+ 13 - 0
fs-service/src/main/java/com/fs/his/dto/FsPrescribeDataBasicInfoDto.java

@@ -0,0 +1,13 @@
+package com.fs.his.dto;
+
+import lombok.Data;
+
+@Data
+public class FsPrescribeDataBasicInfoDto {
+    private Long prescribeId;
+    private String diagnose;
+    private String remark;
+    private String weight;
+    private String isHistoryAllergic;  // 是/否
+    private String historyAllergic;
+}

+ 2 - 1
fs-service/src/main/java/com/fs/his/dto/FsPrescribeDataDoctorUpdateDto.java

@@ -10,7 +10,7 @@ public class FsPrescribeDataDoctorUpdateDto {
     /** 处方状态 0待医生开方 1确认开方 -1医生拒方 */
     private Integer doctorConfirm;
 
-    /** 处方类型 1西药 2中药 */
+    /** 处方类型 1西药 2中药 3中药+西药处方 */
     private Integer prescribeType;
 
     /** 诊断 */
@@ -19,6 +19,7 @@ public class FsPrescribeDataDoctorUpdateDto {
     /** 拒方原因 */
     private String auditReason;
 
+    /** 医嘱 */
     private String remark;
 
     /** 医生id*/

+ 23 - 0
fs-service/src/main/java/com/fs/his/dto/FsPrescribeDataSubmitDto.java

@@ -0,0 +1,23 @@
+package com.fs.his.dto;
+
+import com.fs.his.domain.FsPrescribeDrugDataScrm;
+import lombok.Data;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class FsPrescribeDataSubmitDto {
+    private Long prescribeId;
+    private Integer prescribeType;      // 1西药 2中药 3中药+西药
+    private String patientName;
+    private String patientAge;
+    private Integer patientGender;      // 1男 0女
+    private String weight;
+    private String isHistoryAllergic;   // 是/否
+    private String historyAllergic;
+    private String diagnose;
+    private String remark;
+    private List<FsPrescribeDrugDataScrm> drugs;  // 药品列表
+    private Map<Integer, List<FsPrescribeDrugDataScrm>> mapDrugs;//key为处方类型1西药 2中药,value为药品列表 组合处方就会有两个键值对,否则只有一个
+    private Long doctorId;
+}

+ 86 - 0
fs-service/src/main/java/com/fs/his/mapper/FsPrescribeDrugDataScrmMapper.java

@@ -0,0 +1,86 @@
+package com.fs.his.mapper;
+
+import com.fs.his.domain.FsPrescribeDrugDataScrm;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 处方药品表Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2026-06-15
+ */
+public interface FsPrescribeDrugDataScrmMapper {
+    /**
+     * 查询处方药品表
+     * 
+     * @param drugId 药品ID
+     * @return 处方药品表
+     */
+    public FsPrescribeDrugDataScrm selectFsPrescribeDrugDataScrmById(Long drugId);
+
+    /**
+     * 查询处方药品表列表
+     * 
+     * @param fsPrescribeDrugDataScrm 处方药品表
+     * @return 处方药品表集合
+     */
+    public List<FsPrescribeDrugDataScrm> selectFsPrescribeDrugDataScrmList(FsPrescribeDrugDataScrm fsPrescribeDrugDataScrm);
+
+    /**
+     * 新增处方药品表
+     * 
+     * @param fsPrescribeDrugDataScrm 处方药品表
+     * @return 结果
+     */
+    public int insertFsPrescribeDrugDataScrm(FsPrescribeDrugDataScrm fsPrescribeDrugDataScrm);
+
+    /**
+     * 修改处方药品表
+     * 
+     * @param fsPrescribeDrugDataScrm 处方药品表
+     * @return 结果
+     */
+    public int updateFsPrescribeDrugDataScrm(FsPrescribeDrugDataScrm fsPrescribeDrugDataScrm);
+
+    /**
+     * 删除处方药品表
+     * 
+     * @param drugId 药品ID
+     * @return 结果
+     */
+    public int deleteFsPrescribeDrugDataScrmById(Long drugId);
+
+    /**
+     * 批量删除处方药品表
+     * 
+     * @param drugIds 需要删除的药品ID数组
+     * @return 结果
+     */
+    public int deleteFsPrescribeDrugDataScrmByIds(Long[] drugIds);
+
+    /**
+     * 根据处方ID查询处方药品表
+     *
+     * @param prescribeId 处方ID
+     * @return 处方药品表
+     */
+    List<FsPrescribeDrugDataScrm> selectFsPrescribeDrugDataScrmByPrescribeId(Long prescribeId);
+
+    /**
+     * 根据处方ID删除处方药品表
+     *
+     * @param prescribeId 处方ID
+     * @return 处方药品表
+     */
+    int deleteByPrescribeId(Long prescribeId);
+
+    /**
+     * 批量插入处方药品表
+     *
+     * @param newDrugs 处方药品表
+     * @return 处方药品表
+     */
+    int batchInsertDrugs(@Param("newDrugs") List<FsPrescribeDrugDataScrm> newDrugs);
+}

+ 12 - 2
fs-service/src/main/java/com/fs/his/service/IFsPrescribeDataScrmService.java

@@ -73,9 +73,9 @@ public interface IFsPrescribeDataScrmService
 
 
     /**
-     * 医生---操作商城处方
+     * 商城处方-医生执行拒方
      * */
-    int doctorExecuteScrmPrescribe(FsPrescribeDataDoctorUpdateDto updateDto);
+    int doctorRejectScrmPrescribe(FsPrescribeDataDoctorUpdateDto updateDto);
 
     /**
      * 生成商城处方图片(异步任务调用)
@@ -114,4 +114,14 @@ public interface IFsPrescribeDataScrmService
      * 添加医生建议
      * */
     int addDoctorAdvice(BeforePrescribeAddDoctorAdviceDTO addDoctorAdviceDTO);
+
+    /**
+     * 商城处方-医生提交建议-开方前的操作
+     * */
+    int updateBasicInfo(FsPrescribeDataBasicInfoDto basicInfoDto);
+
+    /**
+     * 商城处方-医生执行开方
+     * */
+    int submitPrescribe(FsPrescribeDataSubmitDto submitDto);
 }

+ 60 - 0
fs-service/src/main/java/com/fs/his/service/IFsPrescribeDrugDataScrmService.java

@@ -0,0 +1,60 @@
+package com.fs.his.service;
+
+import com.fs.his.domain.FsPrescribeDrugDataScrm;
+import java.util.List;
+
+/**
+ * 处方药品表Service接口
+ * 
+ * @author ruoyi
+ * @date 2026-06-15
+ */
+public interface IFsPrescribeDrugDataScrmService {
+    /**
+     * 查询处方药品表
+     * 
+     * @param drugId 药品ID
+     * @return 处方药品表
+     */
+    public FsPrescribeDrugDataScrm selectFsPrescribeDrugDataScrmById(Long drugId);
+
+    /**
+     * 查询处方药品表列表
+     * 
+     * @param fsPrescribeDrugDataScrm 处方药品表
+     * @return 处方药品表集合
+     */
+    public List<FsPrescribeDrugDataScrm> selectFsPrescribeDrugDataScrmList(FsPrescribeDrugDataScrm fsPrescribeDrugDataScrm);
+
+    /**
+     * 新增处方药品表
+     * 
+     * @param fsPrescribeDrugDataScrm 处方药品表
+     * @return 结果
+     */
+    public int insertFsPrescribeDrugDataScrm(FsPrescribeDrugDataScrm fsPrescribeDrugDataScrm);
+
+    /**
+     * 修改处方药品表
+     * 
+     * @param fsPrescribeDrugDataScrm 处方药品表
+     * @return 结果
+     */
+    public int updateFsPrescribeDrugDataScrm(FsPrescribeDrugDataScrm fsPrescribeDrugDataScrm);
+
+    /**
+     * 批量删除处方药品表
+     * 
+     * @param drugIds 需要删除的药品ID数组
+     * @return 结果
+     */
+    public int deleteFsPrescribeDrugDataScrmByIds(Long[] drugIds);
+
+    /**
+     * 删除处方药品表信息
+     * 
+     * @param drugId 药品ID
+     * @return 结果
+     */
+    public int deleteFsPrescribeDrugDataScrmById(Long drugId);
+}

+ 64 - 8
fs-service/src/main/java/com/fs/his/service/impl/FsPrescribeDataScrmServiceImpl.java

@@ -6,10 +6,7 @@ import com.fs.common.utils.DateUtils;
 import com.fs.his.domain.*;
 import com.fs.his.dto.*;
 import com.fs.his.enums.DoctorTypeEnum;
-import com.fs.his.mapper.FsDoctorMapper;
-import com.fs.his.mapper.FsPrescribeDataScrmDrugMapper;
-import com.fs.his.mapper.FsPrescribeDataScrmMapper;
-import com.fs.his.mapper.PrescribeScrmTaskRecordMapper;
+import com.fs.his.mapper.*;
 import com.fs.his.param.PrescribeXyImgParam;
 import com.fs.his.service.IFsPrescribeDataScrmService;
 import com.fs.his.service.PrescriptionImageService;
@@ -55,6 +52,9 @@ public class FsPrescribeDataScrmServiceImpl implements IFsPrescribeDataScrmServi
     @Autowired
     private FsStoreProductScrmMapper fsStoreProductScrmMapper;
 
+    @Autowired
+    private FsPrescribeDrugDataScrmMapper drugDataScrmMapper;
+
     @Autowired
     private FsDoctorMapper fsDoctorMapper;
 
@@ -134,7 +134,7 @@ public class FsPrescribeDataScrmServiceImpl implements IFsPrescribeDataScrmServi
     // ==================== 医生操作 ====================
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public int doctorExecuteScrmPrescribe(FsPrescribeDataDoctorUpdateDto updateDto) {
+    public int doctorRejectScrmPrescribe(FsPrescribeDataDoctorUpdateDto updateDto) {
         // 1. 清除原有基础处方图片
         clearPrescriptionImage(updateDto.getPrescribeId());
 
@@ -226,16 +226,72 @@ public class FsPrescribeDataScrmServiceImpl implements IFsPrescribeDataScrmServi
             log.error("未查询到有效处方信息, 处方id:{}", addDoctorAdviceDTO.getPrescribeId());
             throw new CustomException("未查询到有效处方信息");
         }
-        //组装处方信息
+        //组装处方建议信息
         fsPrescribeDataScrm.setDiagnose(addDoctorAdviceDTO.getDiagnose());
         fsPrescribeDataScrm.setFacialDiagnosis(addDoctorAdviceDTO.getFacialDiagnosis());
+        fsPrescribeDataScrm.setFoodAndExerciseGuidance(addDoctorAdviceDTO.getFoodAndExerciseGuidance());
         fsPrescribeDataScrm.setNoteTaboos(addDoctorAdviceDTO.getNoteTaboos());
-        // 存储前端传来的 JSON 字符串
         fsPrescribeDataScrm.setHealingAreaJson(addDoctorAdviceDTO.getHealingAreaJson());
-        // 执行更新并返回影响行数
         return fsPrescribeDataScrmMapper.updateFsPrescribeDataScrm(fsPrescribeDataScrm);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int updateBasicInfo(FsPrescribeDataBasicInfoDto basicInfoDto) {
+        FsPrescribeDataScrm update = new FsPrescribeDataScrm();
+        update.setPrescribeId(basicInfoDto.getPrescribeId());
+        update.setDiagnose(basicInfoDto.getDiagnose());
+        update.setRemark(basicInfoDto.getRemark());
+        update.setWeight(basicInfoDto.getWeight());
+        update.setIsHistoryAllergic(basicInfoDto.getIsHistoryAllergic());
+        update.setHistoryAllergic(basicInfoDto.getHistoryAllergic());
+        // 注意:不修改 doctorConfirm 和处方类型等字段
+        return fsPrescribeDataScrmMapper.updateFsPrescribeDataScrm(update);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int submitPrescribe(FsPrescribeDataSubmitDto submitDto) {
+        // 1. 清除原处方图片(如果有)
+        clearPrescriptionImage(submitDto.getPrescribeId());
+
+        // 2. 更新处方主表数据
+        FsPrescribeDataScrm update = new FsPrescribeDataScrm();
+        BeanCopyUtils.copy(submitDto, update);
+        update.setDoctorConfirm(1);  // 确认开方
+        int updateCount = fsPrescribeDataScrmMapper.updateFsPrescribeDataScrm(update);
+
+        // 3. 全量覆盖药品列表(删除旧的全部,插入新的)
+        if (submitDto.getMapDrugs() != null && !submitDto.getMapDrugs().isEmpty()) {
+            List<FsPrescribeDrugDataScrm> allDrugs = new ArrayList<>();
+            submitDto.getMapDrugs().values().forEach(allDrugs::addAll);
+            syncDrugsFullCover(submitDto.getPrescribeId(), allDrugs);
+        } else {
+            syncDrugsFullCover(submitDto.getPrescribeId(), submitDto.getDrugs());
+        }
+
+        // 4. 异步生成处方图片(根据处方类型和药品)
+        submitPrescribeImageTask(submitDto.getPrescribeId(), 1);
+
+        // 5. 更新用户状态为待审核(如果有需要)
+        updateCustomerStatus(submitDto.getPrescribeId(), WAIT_AUDIT);
+
+        return updateCount;
+    }
+
+    /**
+     * 全量覆盖药品列表:删除该处方所有旧药品,然后批量插入新列表
+     */
+    private void syncDrugsFullCover(Long prescribeId, List<FsPrescribeDrugDataScrm> newDrugs) {
+        // 1. 删除该处方下所有药品
+        drugDataScrmMapper.deleteByPrescribeId(prescribeId);
+
+        // 2. 批量插入新药品(需要设置prescribeId)
+        if (newDrugs != null && !newDrugs.isEmpty()) {
+             drugDataScrmMapper.batchInsertDrugs(newDrugs);
+        }
+    }
+
     // ==================== 处方图片生成 ====================
     /**
      * 生成处方图片(异步任务调用)

+ 50 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsPrescribeDrugDataScrmServiceImpl.java

@@ -0,0 +1,50 @@
+package com.fs.his.service.impl;
+
+import com.fs.his.domain.FsPrescribeDrugDataScrm;
+import com.fs.his.mapper.FsPrescribeDrugDataScrmMapper;
+import com.fs.his.service.IFsPrescribeDrugDataScrmService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+/**
+ * 处方药品表Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2026-06-15
+ */
+@Service
+public class FsPrescribeDrugDataScrmServiceImpl implements IFsPrescribeDrugDataScrmService {
+    @Autowired
+    private FsPrescribeDrugDataScrmMapper fsPrescribeDrugDataScrmMapper;
+
+    @Override
+    public FsPrescribeDrugDataScrm selectFsPrescribeDrugDataScrmById(Long drugId) {
+        return fsPrescribeDrugDataScrmMapper.selectFsPrescribeDrugDataScrmById(drugId);
+    }
+
+    @Override
+    public List<FsPrescribeDrugDataScrm> selectFsPrescribeDrugDataScrmList(FsPrescribeDrugDataScrm fsPrescribeDrugDataScrm) {
+        return fsPrescribeDrugDataScrmMapper.selectFsPrescribeDrugDataScrmList(fsPrescribeDrugDataScrm);
+    }
+
+    @Override
+    public int insertFsPrescribeDrugDataScrm(FsPrescribeDrugDataScrm fsPrescribeDrugDataScrm) {
+        return fsPrescribeDrugDataScrmMapper.insertFsPrescribeDrugDataScrm(fsPrescribeDrugDataScrm);
+    }
+
+    @Override
+    public int updateFsPrescribeDrugDataScrm(FsPrescribeDrugDataScrm fsPrescribeDrugDataScrm) {
+        return fsPrescribeDrugDataScrmMapper.updateFsPrescribeDrugDataScrm(fsPrescribeDrugDataScrm);
+    }
+
+    @Override
+    public int deleteFsPrescribeDrugDataScrmByIds(Long[] drugIds) {
+        return fsPrescribeDrugDataScrmMapper.deleteFsPrescribeDrugDataScrmByIds(drugIds);
+    }
+
+    @Override
+    public int deleteFsPrescribeDrugDataScrmById(Long drugId) {
+        return fsPrescribeDrugDataScrmMapper.deleteFsPrescribeDrugDataScrmById(drugId);
+    }
+}

+ 1 - 1
fs-service/src/main/java/com/fs/qw/mapper/FsCompanyCustomerMapper.java

@@ -80,5 +80,5 @@ public interface FsCompanyCustomerMapper {
     /**
      * 根据关联处方id更新客户信息表的处方进度状态
      * */
-    int updateProcessStatusByPrescribeId(Long prescribeId, Integer processStatus);
+    int updateProcessStatusByPrescribeId(@Param("prescribeId") Long prescribeId,@Param("processStatus") Integer processStatus);
 }

+ 187 - 0
fs-service/src/main/resources/mapper/his/FsPrescribeDrugDataScrmMapper.xml

@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.his.mapper.FsPrescribeDrugDataScrmMapper">
+
+    <resultMap type="com.fs.his.domain.FsPrescribeDrugDataScrm" id="FsPrescribeDrugDataScrmResult">
+        <id     property="drugId"                column="drug_id"                 />
+        <result property="prescribeId"           column="prescribe_id"            />
+        <result property="drugName"              column="drug_name"               />
+        <result property="drugSpec"              column="drug_spec"               />
+        <result property="usageMethod"           column="usage_method"            />
+        <result property="usageFrequencyUnit"    column="usage_frequency_unit"    />
+        <result property="usagePerUseCount"      column="usage_per_use_count"     />
+        <result property="usagePerUseUnit"       column="usage_per_use_unit"      />
+        <result property="usageDays"             column="usage_days"              />
+        <result property="drugPrice"             column="drug_price"              />
+        <result property="drugNum"               column="drug_num"                />
+        <result property="drugUnit"              column="drug_unit"               />
+        <result property="instructions"          column="instructions"            />
+        <result property="productId"             column="product_id"              />
+        <result property="drugImgUrl"            column="drug_img_url"            />
+        <result property="productAttrValueId"    column="product_attr_value_id"   />
+        <result property="remark"                column="remark"                  />
+        <result property="drugType"              column="drug_type"               />
+        <result property="isDrug"                column="is_drug"                 />
+    </resultMap>
+
+    <sql id="selectFsPrescribeDrugDataScrmVo">
+        select drug_id, prescribe_id, drug_name, drug_spec, usage_method, usage_frequency_unit,
+               usage_per_use_count, usage_per_use_unit, usage_days, drug_price, drug_num,
+               drug_unit, instructions, product_id, drug_img_url, product_attr_value_id,
+               remark, drug_type, is_drug
+        from fs_prescribe_drug_data_scrm
+    </sql>
+
+    <select id="selectFsPrescribeDrugDataScrmList" parameterType="FsPrescribeDrugDataScrm" resultMap="FsPrescribeDrugDataScrmResult">
+        <include refid="selectFsPrescribeDrugDataScrmVo"/>
+        <where>
+            <if test="prescribeId != null"> and prescribe_id = #{prescribeId}</if>
+            <if test="drugName != null and drugName != ''"> and drug_name like concat('%', #{drugName}, '%')</if>
+            <if test="drugSpec != null and drugSpec != ''"> and drug_spec like concat('%', #{drugSpec}, '%')</if>
+            <if test="usageMethod != null and usageMethod != ''"> and usage_method like concat('%', #{usageMethod}, '%')</if>
+            <if test="usageFrequencyUnit != null and usageFrequencyUnit != ''"> and usage_frequency_unit = #{usageFrequencyUnit}</if>
+            <if test="usagePerUseCount != null and usagePerUseCount != ''"> and usage_per_use_count = #{usagePerUseCount}</if>
+            <if test="usagePerUseUnit != null and usagePerUseUnit != ''"> and usage_per_use_unit = #{usagePerUseUnit}</if>
+            <if test="usageDays != null and usageDays != ''"> and usage_days = #{usageDays}</if>
+            <if test="drugPrice != null"> and drug_price = #{drugPrice}</if>
+            <if test="drugNum != null"> and drug_num = #{drugNum}</if>
+            <if test="drugUnit != null and drugUnit != ''"> and drug_unit = #{drugUnit}</if>
+            <if test="instructions != null and instructions != ''"> and instructions like concat('%', #{instructions}, '%')</if>
+            <if test="productId != null"> and product_id = #{productId}</if>
+            <if test="drugImgUrl != null and drugImgUrl != ''"> and drug_img_url like concat('%', #{drugImgUrl}, '%')</if>
+            <if test="productAttrValueId != null"> and product_attr_value_id = #{productAttrValueId}</if>
+            <if test="remark != null and remark != ''"> and remark like concat('%', #{remark}, '%')</if>
+            <if test="drugType != null"> and drug_type = #{drugType}</if>
+            <if test="isDrug != null"> and is_drug = #{isDrug}</if>
+        </where>
+        order by drug_id desc
+    </select>
+
+    <select id="selectFsPrescribeDrugDataScrmById" parameterType="Long" resultMap="FsPrescribeDrugDataScrmResult">
+        <include refid="selectFsPrescribeDrugDataScrmVo"/>
+        where drug_id = #{drugId}
+    </select>
+
+    <select id="selectFsPrescribeDrugDataScrmByPrescribeId" parameterType="Long" resultMap="FsPrescribeDrugDataScrmResult">
+        <include refid="selectFsPrescribeDrugDataScrmVo"/>
+        where prescribe_id = #{prescribeId}
+    </select>
+
+    <insert id="insertFsPrescribeDrugDataScrm" parameterType="FsPrescribeDrugDataScrm" useGeneratedKeys="true" keyProperty="drugId">
+        insert into fs_prescribe_drug_data_scrm
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="prescribeId != null">prescribe_id,</if>
+            <if test="drugName != null">drug_name,</if>
+            <if test="drugSpec != null">drug_spec,</if>
+            <if test="usageMethod != null">usage_method,</if>
+            <if test="usageFrequencyUnit != null">usage_frequency_unit,</if>
+            <if test="usagePerUseCount != null">usage_per_use_count,</if>
+            <if test="usagePerUseUnit != null">usage_per_use_unit,</if>
+            <if test="usageDays != null">usage_days,</if>
+            <if test="drugPrice != null">drug_price,</if>
+            <if test="drugNum != null">drug_num,</if>
+            <if test="drugUnit != null">drug_unit,</if>
+            <if test="instructions != null">instructions,</if>
+            <if test="productId != null">product_id,</if>
+            <if test="drugImgUrl != null">drug_img_url,</if>
+            <if test="productAttrValueId != null">product_attr_value_id,</if>
+            <if test="remark != null">remark,</if>
+            <if test="drugType != null">drug_type,</if>
+            <if test="isDrug != null">is_drug,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="prescribeId != null">#{prescribeId},</if>
+            <if test="drugName != null">#{drugName},</if>
+            <if test="drugSpec != null">#{drugSpec},</if>
+            <if test="usageMethod != null">#{usageMethod},</if>
+            <if test="usageFrequencyUnit != null">#{usageFrequencyUnit},</if>
+            <if test="usagePerUseCount != null">#{usagePerUseCount},</if>
+            <if test="usagePerUseUnit != null">#{usagePerUseUnit},</if>
+            <if test="usageDays != null">#{usageDays},</if>
+            <if test="drugPrice != null">#{drugPrice},</if>
+            <if test="drugNum != null">#{drugNum},</if>
+            <if test="drugUnit != null">#{drugUnit},</if>
+            <if test="instructions != null">#{instructions},</if>
+            <if test="productId != null">#{productId},</if>
+            <if test="drugImgUrl != null">#{drugImgUrl},</if>
+            <if test="productAttrValueId != null">#{productAttrValueId},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="drugType != null">#{drugType},</if>
+            <if test="isDrug != null">#{isDrug},</if>
+        </trim>
+    </insert>
+
+    <!-- 批量插入处方药品表 -->
+    <insert id="batchInsertDrugs" parameterType="list">
+        insert into fs_prescribe_drug_data_scrm (
+        prescribe_id, drug_name, drug_spec, usage_method, usage_frequency_unit,
+        usage_per_use_count, usage_per_use_unit, usage_days, drug_price, drug_num,
+        drug_unit, instructions, product_id, drug_img_url, product_attr_value_id,
+        remark, drug_type, is_drug
+        ) values
+        <foreach collection="newDrugs" item="item" separator=",">
+            (
+            #{item.prescribeId},
+            #{item.drugName},
+            #{item.drugSpec},
+            #{item.usageMethod},
+            #{item.usageFrequencyUnit},
+            #{item.usagePerUseCount},
+            #{item.usagePerUseUnit},
+            #{item.usageDays},
+            #{item.drugPrice},
+            #{item.drugNum},
+            #{item.drugUnit},
+            #{item.instructions},
+            #{item.productId},
+            #{item.drugImgUrl},
+            #{item.productAttrValueId},
+            #{item.remark},
+            #{item.drugType},
+            #{item.isDrug}
+            )
+        </foreach>
+    </insert>
+
+    <update id="updateFsPrescribeDrugDataScrm" parameterType="FsPrescribeDrugDataScrm">
+        update fs_prescribe_drug_data_scrm
+        <set>
+            <if test="prescribeId != null">prescribe_id = #{prescribeId},</if>
+            <if test="drugName != null">drug_name = #{drugName},</if>
+            <if test="drugSpec != null">drug_spec = #{drugSpec},</if>
+            <if test="usageMethod != null">usage_method = #{usageMethod},</if>
+            <if test="usageFrequencyUnit != null">usage_frequency_unit = #{usageFrequencyUnit},</if>
+            <if test="usagePerUseCount != null">usage_per_use_count = #{usagePerUseCount},</if>
+            <if test="usagePerUseUnit != null">usage_per_use_unit = #{usagePerUseUnit},</if>
+            <if test="usageDays != null">usage_days = #{usageDays},</if>
+            <if test="drugPrice != null">drug_price = #{drugPrice},</if>
+            <if test="drugNum != null">drug_num = #{drugNum},</if>
+            <if test="drugUnit != null">drug_unit = #{drugUnit},</if>
+            <if test="instructions != null">instructions = #{instructions},</if>
+            <if test="productId != null">product_id = #{productId},</if>
+            <if test="drugImgUrl != null">drug_img_url = #{drugImgUrl},</if>
+            <if test="productAttrValueId != null">product_attr_value_id = #{productAttrValueId},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="drugType != null">drug_type = #{drugType},</if>
+            <if test="isDrug != null">is_drug = #{isDrug},</if>
+        </set>
+        where drug_id = #{drugId}
+    </update>
+
+    <delete id="deleteFsPrescribeDrugDataScrmById" parameterType="Long">
+        delete from fs_prescribe_drug_data_scrm where drug_id = #{drugId}
+    </delete>
+
+    <delete id="deleteFsPrescribeDrugDataScrmByIds" parameterType="Long">
+        delete from fs_prescribe_drug_data_scrm where drug_id in
+        <foreach collection="array" item="drugId" open="(" separator="," close=")">
+            #{drugId}
+        </foreach>
+    </delete>
+
+    <delete id="deleteByPrescribeId">
+        delete from fs_prescribe_drug_data_scrm where prescribe_id = #{prescribeId}
+    </delete>
+</mapper>