mitao
2024-12-12 6a3bb2d68efeaf0e6609a14e29412c3805730ce8
转运箱管理
9个文件已修改
11个文件已添加
1172 ■■■■■ 已修改文件
medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwBoxController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwStagingRoomController.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-admin/src/main/resources/sql-error-codes.xml 311 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-common/src/main/java/com/sinata/common/enums/BoxProcessEnum.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-common/src/main/java/com/sinata/common/enums/BoxStatusEnum.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/MwBox.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwBoxDTO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwStagingRoomDTO.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwBoxPageQuery.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwStagingRoomQuery.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/query/StorageRecordQuery.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/BoxStatisticsVO.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwBoxVO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwStagingRoomVO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/mapper/MwStagingRoomMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/MwBoxService.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/MwStagingRoomService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwBoxServiceImpl.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwStagingRoomServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/resources/mapper/system/MwStagingRoomMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwBoxController.java
@@ -1,7 +1,29 @@
package com.sinata.web.controller.backend;
import com.sinata.common.core.domain.R;
import com.sinata.common.entity.PageDTO;
import com.sinata.system.domain.dto.MwBoxDTO;
import com.sinata.system.domain.query.MwBoxPageQuery;
import com.sinata.system.domain.vo.BoxStatisticsVO;
import com.sinata.system.domain.vo.MwBoxVO;
import com.sinata.system.service.MwBoxService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import java.util.List;
/**
 * <p>
@@ -11,8 +33,77 @@
 * @author mitao
 * @since 2024-12-02
 */
@Api(tags = {"转运箱管理相关接口"})
@Validated
@RestController
@RequiredArgsConstructor
@RequestMapping("/backend/mwBox")
public class MwBoxController {
    private final MwBoxService boxService;
    /**
     * 转运箱数据统计
     *
     * @return
     */
    @GetMapping("/statistics")
    @ApiOperation("转运箱数据统计")
    public R<BoxStatisticsVO> getBoxStatistics() {
        return R.ok(boxService.getBoxStatistics());
    }
    /**
     * 转运箱分页列表
     *
     * @param query
     * @return
     */
    @PostMapping("/page")
    @ApiOperation("转运箱分页列表")
    public R<PageDTO<MwBoxVO>> pageList(@Valid @RequestBody MwBoxPageQuery query) {
        return R.ok(boxService.pageList(query));
    }
    /**
     * 新增转运箱
     *
     * @param boxNumberStart
     * @param boxNumberEnd
     * @return
     */
    @PostMapping("/add")
    @ApiOperation("新增转运箱")
    @ApiImplicitParams({@ApiImplicitParam(name = "boxNumberStart", value = "转运箱编号开始", required = true),
            @ApiImplicitParam(name = "boxNumberEnd", value = "转运箱编号结束", required = true)})
    public R<?> add(@RequestParam String boxNumberStart, @RequestParam String boxNumberEnd) {
        boxService.add(boxNumberStart, boxNumberEnd);
        return R.ok();
    }
    /**
     * 编辑转运箱状态
     *
     * @param dtoList
     * @return
     */
    @PostMapping("/editBatch")
    @ApiOperation("批量修改转运箱状态")
    public R<?> editBatch(@Valid @RequestBody List<MwBoxDTO> dtoList) {
        boxService.editBatch(dtoList);
        return R.ok();
    }
    /**
     * 批量删除
     *
     * @param idList
     * @return
     */
    @PostMapping("/delBatch")
    @ApiOperation("批量删除")
    public R<?> delBatch(@ApiParam(name = "idList", value = "转运箱id列表", required = true, allowMultiple = true) @NotEmpty(message = "转运箱列表不能为空") @RequestBody List<Long> idList) {
        boxService.removeByIds(idList);
        return R.ok();
    }
}
medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwStagingRoomController.java
@@ -1,7 +1,27 @@
package com.sinata.web.controller.backend;
import com.sinata.common.core.domain.R;
import com.sinata.common.entity.PageDTO;
import com.sinata.system.domain.dto.MwStagingRoomDTO;
import com.sinata.system.domain.query.MwStagingRoomQuery;
import com.sinata.system.domain.query.StorageRecordQuery;
import com.sinata.system.domain.vo.MwCollectRecordVO;
import com.sinata.system.domain.vo.MwStagingRoomVO;
import com.sinata.system.service.MwStagingRoomService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
 * <p>
@@ -11,8 +31,86 @@
 * @author mitao
 * @since 2024-12-02
 */
@Api(tags = {"暂存间管理相关接口"})
@Validated
@RestController
@RequiredArgsConstructor
@RequestMapping("/backend/mwStagingRoom")
public class MwStagingRoomController {
    private final MwStagingRoomService mwStagingRoomService;
    /**
     * 暂存间分页列表
     *
     * @param query
     * @return
     */
    @PostMapping("/page")
    @ApiOperation("暂存间分页列表")
    public R<PageDTO<MwStagingRoomVO>> pageList(@Valid @RequestBody MwStagingRoomQuery query) {
        return R.ok(mwStagingRoomService.pageList(query));
    }
    /**
     * 新增暂存间
     *
     * @param dto
     * @return
     */
    @PostMapping("/add")
    @ApiOperation("新增暂存间")
    public R<?> add(@Valid @RequestBody MwStagingRoomDTO dto) {
        mwStagingRoomService.add(dto);
        return R.ok();
    }
    /**
     * 编辑暂存间
     *
     * @param dto
     * @return
     */
    @PostMapping("/edit")
    @ApiOperation("编辑暂存间")
    public R<?> edit(@Valid @RequestBody MwStagingRoomDTO dto) {
        mwStagingRoomService.edit(dto);
        return R.ok();
    }
    /**
     * 删除暂存间
     *
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")
    @ApiOperation("删除暂存间")
    public R<?> delete(@ApiParam(name = "id", value = "暂存间id", required = true) @PathVariable("id") Long id) {
        mwStagingRoomService.removeById(id);
        return R.ok();
    }
    /**
     * 根据医院id查询暂存间
     *
     * @param departmentId
     * @return
     */
    @GetMapping("/getByHospitalId/{departmentId}")
    @ApiOperation(value = "根据医院id查询暂存间", notes = "入库、出库记录暂存间筛选级联数据")
    public R<MwStagingRoomVO> getByHospitalId(@ApiParam(name = "departmentId", value = "医院id", required = true) @PathVariable("departmentId") Long departmentId) {
        return R.ok(mwStagingRoomService.getByHospitalId(departmentId));
    }
    /**
     * 暂存间入库记录
     *
     * @param query
     * @return
     */
    @PostMapping("/storageRecord")
    @ApiOperation("暂存间入库记录")
    public R<PageDTO<MwCollectRecordVO>> storageRecord(@Valid @RequestBody StorageRecordQuery query) {
        return R.ok(mwStagingRoomService.storageRecord(query));
    }
}
medicalWaste-admin/src/main/resources/sql-error-codes.xml
New file
@@ -0,0 +1,311 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "https://www.springframework.org/dtd/spring-beans-2.0.dtd">
<!--
    - Default SQL error codes for well-known databases.
    - Can be overridden by definitions in a "sql-error-codes.xml" file
    - in the root of the class path.
    -
    - If the Database Product Name contains characters that are invalid
    - to use in the id attribute (like a space) then we need to add a property
    - named "databaseProductName"/"databaseProductNames" that holds this value.
    - If this property is present, then it will be used instead of the id for
    - looking up the error codes based on the current database.
    -->
<beans>
    <bean id="DB2" name="Db2" class="org.springframework.jdbc.support.SQLErrorCodes">
        <property name="databaseProductName">
            <value>DB2*</value>
        </property>
        <property name="badSqlGrammarCodes">
            <value>-007,-029,-097,-104,-109,-115,-128,-199,-204,-206,-301,-408,-441,-491</value>
        </property>
        <property name="duplicateKeyCodes">
            <value>-803</value>
        </property>
        <property name="dataIntegrityViolationCodes">
            <value>-407,-530,-531,-532,-543,-544,-545,-603,-667</value>
        </property>
        <property name="dataAccessResourceFailureCodes">
            <value>-904,-971</value>
        </property>
        <property name="transientDataAccessResourceCodes">
            <value>-1035,-1218,-30080,-30081</value>
        </property>
        <property name="deadlockLoserCodes">
            <value>-911,-913</value>
        </property>
    </bean>
    <bean id="Derby" class="org.springframework.jdbc.support.SQLErrorCodes">
        <property name="databaseProductName">
            <value>Apache Derby</value>
        </property>
        <property name="useSqlStateForTranslation">
            <value>true</value>
        </property>
        <property name="badSqlGrammarCodes">
            <value>42802,42821,42X01,42X02,42X03,42X04,42X05,42X06,42X07,42X08</value>
        </property>
        <property name="duplicateKeyCodes">
            <value>23505</value>
        </property>
        <property name="dataIntegrityViolationCodes">
            <value>22001,22005,23502,23503,23513,X0Y32</value>
        </property>
        <property name="dataAccessResourceFailureCodes">
            <value>04501,08004,42Y07</value>
        </property>
        <property name="cannotAcquireLockCodes">
            <value>40XL1</value>
        </property>
        <property name="deadlockLoserCodes">
            <value>40001</value>
        </property>
    </bean>
    <bean id="H2" class="org.springframework.jdbc.support.SQLErrorCodes">
        <property name="badSqlGrammarCodes">
            <value>42000,42001,42101,42102,42111,42112,42121,42122,42132</value>
        </property>
        <property name="duplicateKeyCodes">
            <value>23001,23505</value>
        </property>
        <property name="dataIntegrityViolationCodes">
            <value>22001,22003,22012,22018,22025,23000,23002,23003,23502,23503,23506,23507,23513</value>
        </property>
        <property name="dataAccessResourceFailureCodes">
            <value>90046,90100,90117,90121,90126</value>
        </property>
        <property name="cannotAcquireLockCodes">
            <value>50200</value>
        </property>
    </bean>
    <!-- https://help.sap.com/saphelp_hanaplatform/helpdata/en/20/a78d3275191014b41bae7c4a46d835/content.htm -->
    <bean id="HDB" name="Hana" class="org.springframework.jdbc.support.SQLErrorCodes">
        <property name="databaseProductNames">
            <list>
                <value>SAP HANA</value>
                <value>SAP DB</value>
            </list>
        </property>
        <property name="badSqlGrammarCodes">
            <value>
                257,259,260,261,262,263,264,267,268,269,270,271,272,273,275,276,277,278,
                278,279,280,281,282,283,284,285,286,288,289,290,294,295,296,297,299,308,309,
                313,315,316,318,319,320,321,322,323,324,328,329,330,333,335,336,337,338,340,
                343,350,351,352,362,368
            </value>
        </property>
        <property name="permissionDeniedCodes">
            <value>10,258</value>
        </property>
        <property name="duplicateKeyCodes">
            <value>301</value>
        </property>
        <property name="dataIntegrityViolationCodes">
            <value>461,462</value>
        </property>
        <property name="dataAccessResourceFailureCodes">
            <value>-813,-709,-708,1024,1025,1026,1027,1029,1030,1031</value>
        </property>
        <property name="invalidResultSetAccessCodes">
            <value>-11210,582,587,588,594</value>
        </property>
        <property name="cannotAcquireLockCodes">
            <value>131</value>
        </property>
        <property name="cannotSerializeTransactionCodes">
            <value>138,143</value>
        </property>
        <property name="deadlockLoserCodes">
            <value>133</value>
        </property>
    </bean>
    <bean id="HSQL" name="Hsql" class="org.springframework.jdbc.support.SQLErrorCodes">
        <property name="databaseProductName">
            <value>HSQL Database Engine</value>
        </property>
        <property name="badSqlGrammarCodes">
            <value>-22,-28</value>
        </property>
        <property name="duplicateKeyCodes">
            <value>-104</value>
        </property>
        <property name="dataIntegrityViolationCodes">
            <value>-9</value>
        </property>
        <property name="dataAccessResourceFailureCodes">
            <value>-80</value>
        </property>
    </bean>
    <bean id="Informix" class="org.springframework.jdbc.support.SQLErrorCodes">
        <property name="databaseProductName">
            <value>Informix Dynamic Server</value>
        </property>
        <property name="badSqlGrammarCodes">
            <value>-201,-217,-696</value>
        </property>
        <property name="duplicateKeyCodes">
            <value>-239,-268,-6017</value>
        </property>
        <property name="dataIntegrityViolationCodes">
            <value>-692,-11030</value>
        </property>
    </bean>
    <bean id="MS-SQL" name="SqlServer" class="org.springframework.jdbc.support.SQLErrorCodes">
        <property name="databaseProductName">
            <value>Microsoft SQL Server</value>
        </property>
        <property name="badSqlGrammarCodes">
            <value>156,170,207,208,209</value>
        </property>
        <property name="permissionDeniedCodes">
            <value>229</value>
        </property>
        <property name="duplicateKeyCodes">
            <value>2601,2627</value>
        </property>
        <property name="dataIntegrityViolationCodes">
            <value>544,2628,8114,8115</value>
        </property>
        <property name="dataAccessResourceFailureCodes">
            <value>4060</value>
        </property>
        <property name="cannotAcquireLockCodes">
            <value>1222</value>
        </property>
        <property name="deadlockLoserCodes">
            <value>1205</value>
        </property>
    </bean>
    <bean id="MySQL" class="org.springframework.jdbc.support.SQLErrorCodes">
        <property name="databaseProductNames">
            <list>
                <value>MySQL</value>
                <value>MariaDB</value>
            </list>
        </property>
        <property name="badSqlGrammarCodes">
            <value>1054,1064,1146</value>
        </property>
        <property name="duplicateKeyCodes">
            <value>1062</value>
        </property>
        <property name="dataIntegrityViolationCodes">
            <value>630,839,840,893,1169,1215,1216,1217,1364,1451,1452,1557</value>
        </property>
        <property name="dataAccessResourceFailureCodes">
            <value>1</value>
        </property>
        <property name="cannotAcquireLockCodes">
            <value>1205,3572</value>
        </property>
        <property name="deadlockLoserCodes">
            <value>1213</value>
        </property>
    </bean>
    <bean id="Oracle" class="org.springframework.jdbc.support.SQLErrorCodes">
        <property name="badSqlGrammarCodes">
            <value>900,903,904,917,936,942,17006,6550</value>
        </property>
        <property name="invalidResultSetAccessCodes">
            <value>17003</value>
        </property>
        <property name="duplicateKeyCodes">
            <value>1</value>
        </property>
        <property name="dataIntegrityViolationCodes">
            <value>1400,1722,2291,2292</value>
        </property>
        <property name="dataAccessResourceFailureCodes">
            <value>17002,17447</value>
        </property>
        <property name="cannotAcquireLockCodes">
            <value>54,30006</value>
        </property>
        <property name="cannotSerializeTransactionCodes">
            <value>8177</value>
        </property>
        <property name="deadlockLoserCodes">
            <value>60</value>
        </property>
    </bean>
    <bean id="PostgreSQL" name="Postgres" class="org.springframework.jdbc.support.SQLErrorCodes">
        <property name="useSqlStateForTranslation">
            <value>true</value>
        </property>
        <property name="badSqlGrammarCodes">
            <value>03000,42000,42601,42602,42622,42804,42P01</value>
        </property>
        <property name="duplicateKeyCodes">
            <value>21000,23505</value>
        </property>
        <property name="dataIntegrityViolationCodes">
            <value>23000,23502,23503,23514</value>
        </property>
        <property name="dataAccessResourceFailureCodes">
            <value>53000,53100,53200,53300</value>
        </property>
        <property name="cannotAcquireLockCodes">
            <value>55P03</value>
        </property>
        <property name="cannotSerializeTransactionCodes">
            <value>40001</value>
        </property>
        <property name="deadlockLoserCodes">
            <value>40P01</value>
        </property>
    </bean>
    <bean id="Sybase" class="org.springframework.jdbc.support.SQLErrorCodes">
        <property name="databaseProductNames">
            <list>
                <value>Sybase SQL Server</value>
                <value>Adaptive Server Enterprise</value>
                <value>ASE</value>  <!-- name as returned by jTDS driver -->
                <value>SQL Server</value>
                <value>sql server</value>  <!-- name as returned by jTDS driver -->
            </list>
        </property>
        <property name="badSqlGrammarCodes">
            <value>101,102,103,104,105,106,107,108,109,110,111,112,113,116,120,121,123,207,208,213,257,512</value>
        </property>
        <property name="duplicateKeyCodes">
            <value>2601,2615,2626</value>
        </property>
        <property name="dataIntegrityViolationCodes">
            <value>233,511,515,530,546,547,2615,2714</value>
        </property>
        <property name="transientDataAccessResourceCodes">
            <value>921,1105</value>
        </property>
        <property name="cannotAcquireLockCodes">
            <value>12205</value>
        </property>
        <property name="deadlockLoserCodes">
            <value>1205</value>
        </property>
    </bean>
    <!-- 支持达梦数据库错误码-->
    <bean id="DM" class="org.springframework.jdbc.support.SQLErrorCodes">
        <property name="databaseProductNames">
            <list>
                <!-- 数据源名称存在空格不能像Oracle一样直接作为beanId -->
                <value>DM DBMS</value>
            </list>
        </property>
        <property name="duplicateKeyCodes">
            <value>-6602</value>
        </property>
    </bean>
</beans>
medicalWaste-common/src/main/java/com/sinata/common/enums/BoxProcessEnum.java
New file
@@ -0,0 +1,25 @@
package com.sinata.common.enums;
import lombok.Getter;
import lombok.AllArgsConstructor;
@Getter
@AllArgsConstructor
public enum BoxProcessEnum {
    HOSPITAL_USING(1, "医院在用"),
    TRANSITING(2, "医疗废物车载"),
    READY_TO_DISPOSAL(3, "待处置"),
    DISPOSAL(4, "处置消毒");
    private final Integer code;
    private final String desc;
    public static BoxProcessEnum getEnumByCode(Integer code) {
        for (BoxProcessEnum e : BoxProcessEnum.values()) {
            if (e.code.equals(code)) {
                return e;
            }
        }
        return null;
    }
}
medicalWaste-common/src/main/java/com/sinata/common/enums/BoxStatusEnum.java
New file
@@ -0,0 +1,24 @@
package com.sinata.common.enums;
import lombok.Getter;
import lombok.AllArgsConstructor;
@Getter
@AllArgsConstructor
public enum BoxStatusEnum {
    NORMAL(1, "正常"),
    LOST(2, "丢失"),
    BROKEN(3, "破坏");
    private final Integer code;
    private final String desc;
    public static BoxStatusEnum getEnumByCode(Integer code) {
        for (BoxStatusEnum e : BoxStatusEnum.values()) {
            if (e.code.equals(code)) {
                return e;
            }
        }
        return null;
    }
}
medicalWaste-system/src/main/java/com/sinata/system/domain/MwBox.java
@@ -1,15 +1,17 @@
package com.sinata.system.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sinata.common.entity.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
/**
@@ -24,7 +26,7 @@
@Setter
@TableName("MW_BOX")
@ApiModel(value = "MwBox对象", description = "转运箱")
public class MwBox extends BaseModel {
public class MwBox implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -36,7 +38,7 @@
    @TableField("BOX_NUMBER")
    private String boxNumber;
    @ApiModelProperty("转运箱状态 1:正常 2:丢失 3:破坏 4:正常")
    @ApiModelProperty("转运箱状态 1:正常 2:丢失 3:破坏")
    @TableField("STATUS")
    private Integer status;
@@ -52,5 +54,39 @@
    @TableField("LINK")
    private Integer link;
    /**
     * 创建者
     */
    @ApiModelProperty(value = "记录创建人,前端忽略")
    @TableField(value = "create_by", fill = FieldFill.INSERT)
    private Long createBy;
    /**
     * 创建时间
     */
    @ApiModelProperty(value = "记录创建时间,前端忽略")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;
    /**
     * 更新者
     */
    @ApiModelProperty(value = "记录修改人,前端忽略")
    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
    private Long updateBy;
    /**
     * 更新时间
     */
    @ApiModelProperty(value = "记录修改时间,前端忽略")
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    /**
     * 是否删除 0未删除 1已删除
     */
    @TableField("del_flag")
    @ApiModelProperty(value = "是否删除 0未删除 1已删除")
    @TableLogic(value = "0", delval = "NULL")
    private Integer delFlag;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwBoxDTO.java
New file
@@ -0,0 +1,28 @@
package com.sinata.system.domain.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
 * @author mitao
 * @date 2024/12/12
 */
@Data
@ApiModel("转运箱数据传输对象")
public class MwBoxDTO {
    @ApiModelProperty("转运箱id")
    @NotNull(message = "转运箱id不能为空")
    private Long id;
    @ApiModelProperty("转运箱状态 1:正常 2:丢失 3:破坏")
    @NotNull(message = "转运箱状态不能为空")
    private Integer status;
    @ApiModelProperty("备注")
    private String remark;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwStagingRoomDTO.java
New file
@@ -0,0 +1,32 @@
package com.sinata.system.domain.dto;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
 * @author mitao
 * @date 2024/12/12
 */
@Data
@ApiOperation("暂存间数据传输对象")
public class MwStagingRoomDTO {
    @ApiModelProperty("暂存间id")
    private Long id;
    @ApiModelProperty("区域id(医院id)")
    @NotNull(message = "医院id不能为空")
    private Long departmentId;
    @ApiModelProperty("暂存间名称")
    @NotBlank(message = "暂存间名称不能为空")
    private String roomName;
    @ApiModelProperty("最大容量(箱)")
    @NotNull(message = "最大容量不能为空")
    private Integer maxCapacity;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwBoxPageQuery.java
New file
@@ -0,0 +1,39 @@
package com.sinata.system.domain.query;
import com.sinata.common.entity.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
 * @author mitao
 * @date 2024/12/12
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel("转运箱查询数据传输对象")
public class MwBoxPageQuery extends BasePage {
    private static final long serialVersionUID = -5341744240105838832L;
    @ApiModelProperty("编号-开始")
    private String boxNumberStart;
    @ApiModelProperty("编号-结束")
    private String boxNumberEnd;
    @ApiModelProperty("转运箱状态 1:正常 2:丢失 3:破坏")
    private Integer status;
    @ApiModelProperty("转运箱环节 1:医院在用 2:医疗废物车载 3:待处置 4:处置消毒")
    private Integer link;
    @ApiModelProperty("最后使用时间-开始")
    private Date lastUseTimeStart;
    @ApiModelProperty("最后使用时间-结束")
    private Date lastUseTimeEnd;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwStagingRoomQuery.java
New file
@@ -0,0 +1,22 @@
package com.sinata.system.domain.query;
import com.sinata.common.entity.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * @author mitao
 * @date 2024/12/12
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel("暂存间查询数据传输对象")
public class MwStagingRoomQuery extends BasePage {
    private static final long serialVersionUID = -4437483386027508070L;
    @ApiModelProperty("医院id")
    private Long departmentId;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/query/StorageRecordQuery.java
New file
@@ -0,0 +1,39 @@
package com.sinata.system.domain.query;
import com.sinata.common.entity.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
 * @author mitao
 * @date 2024/12/12
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel("暂存间入库记录查询数据传输对象")
public class StorageRecordQuery extends BasePage {
    private static final long serialVersionUID = 3037481981686862175L;
    @ApiModelProperty("机构id")
    private Long departmentId;
    @ApiModelProperty("暂存间id")
    private Long stagingRoomId;
    @ApiModelProperty("医废编号")
    private String medicalWasteNumber;
    @ApiModelProperty("箱子编号")
    private String boxNumber;
    @ApiModelProperty("医废类型")
    private Integer wasteType;
    @ApiModelProperty("入库时间")
    private Date collectTime;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/BoxStatisticsVO.java
New file
@@ -0,0 +1,32 @@
package com.sinata.system.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author mitao
 * @date 2024/12/11
 */
@Data
@ApiModel("转运箱统计视图对象")
public class BoxStatisticsVO {
    @ApiModelProperty("转运箱总数")
    private Integer total = 0;
    @ApiModelProperty("转运箱破坏总数")
    private Long brokenCount = 0L;
    @ApiModelProperty("转运箱丢失总数")
    private Long lostCount = 0L;
    @ApiModelProperty("处置消毒转运箱总数")
    private Long disposeCount = 0L;
    @ApiModelProperty("医院在用转运箱总数")
    private Long hospitalUsingCount = 0L;
    @ApiModelProperty("医疗废物车载转运箱总数")
    private Long transitingCount = 0L;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwBoxVO.java
New file
@@ -0,0 +1,34 @@
package com.sinata.system.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * @author mitao
 * @date 2024/12/12
 */
@Data
@ApiModel("转运箱视图对象")
public class MwBoxVO {
    @ApiModelProperty("转运箱id")
    private Long id;
    @ApiModelProperty("转运箱编号")
    private String boxNumber;
    @ApiModelProperty("转运箱状态 1:正常 2:丢失 3:破坏")
    private Integer status;
    @ApiModelProperty("最后使用时间")
    private Date lastUseTime;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("转运箱环节 1:医院在用 2:医疗废物车载 3:待处置 4:处置消毒")
    private Integer link;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwStagingRoomVO.java
New file
@@ -0,0 +1,38 @@
package com.sinata.system.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author mitao
 * @date 2024/12/12
 */
@Data
@ApiModel("暂存间视图对象")
public class MwStagingRoomVO {
    @ApiModelProperty("暂存间id")
    private Long id;
    @ApiModelProperty("区域id(医院id)")
    private Long departmentId;
    @ApiModelProperty("医院名称")
    private String hospitalName;
    @ApiModelProperty("暂存间名称")
    private String roomName;
    @ApiModelProperty("最大容量(箱)")
    private Integer maxCapacity;
    @ApiModelProperty("已使用数量")
    private Integer usedNum;
    @ApiModelProperty("未使用数量")
    private Integer unused;
    @ApiModelProperty("添加时间")
    private String createTime;
}
medicalWaste-system/src/main/java/com/sinata/system/mapper/MwStagingRoomMapper.java
@@ -1,8 +1,11 @@
package com.sinata.system.mapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sinata.system.domain.MwStagingRoom;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sinata.system.domain.vo.MwStagingRoomVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
@@ -14,5 +17,13 @@
 */
@Mapper
public interface MwStagingRoomMapper extends BaseMapper<MwStagingRoom> {
    /**
     * 暂存间分页列表
     *
     * @param objectPage
     * @param departmentId
     * @param treeCode
     * @return
     */
    Page<MwStagingRoomVO> pagelist(Page<Object> objectPage, @Param("departmentId") Long departmentId, @Param("treeCode") String treeCode);
}
medicalWaste-system/src/main/java/com/sinata/system/service/MwBoxService.java
@@ -1,7 +1,14 @@
package com.sinata.system.service;
import com.sinata.common.entity.PageDTO;
import com.sinata.system.domain.MwBox;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sinata.system.domain.dto.MwBoxDTO;
import com.sinata.system.domain.query.MwBoxPageQuery;
import com.sinata.system.domain.vo.BoxStatisticsVO;
import com.sinata.system.domain.vo.MwBoxVO;
import java.util.List;
/**
 * <p>
@@ -12,5 +19,35 @@
 * @since 2024-12-02
 */
public interface MwBoxService extends IService<MwBox> {
    /**
     * 转运箱数据统计
     *
     * @return
     */
    BoxStatisticsVO getBoxStatistics();
    /**
     * 转运箱分页列表
     *
     * @param query
     * @return
     */
    PageDTO<MwBoxVO> pageList(MwBoxPageQuery query);
    /**
     * 新增转运箱
     *
     * @param boxNumberStart
     * @param boxNumberEnd
     * @return
     */
    void add(String boxNumberStart, String boxNumberEnd);
    /**
     * 编辑转运箱状态
     *
     * @param dtoList
     * @return
     */
    void editBatch(List<MwBoxDTO> dtoList);
}
medicalWaste-system/src/main/java/com/sinata/system/service/MwStagingRoomService.java
@@ -1,7 +1,13 @@
package com.sinata.system.service;
import com.sinata.common.entity.PageDTO;
import com.sinata.system.domain.MwStagingRoom;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sinata.system.domain.dto.MwStagingRoomDTO;
import com.sinata.system.domain.query.MwStagingRoomQuery;
import com.sinata.system.domain.query.StorageRecordQuery;
import com.sinata.system.domain.vo.MwCollectRecordVO;
import com.sinata.system.domain.vo.MwStagingRoomVO;
/**
 * <p>
@@ -12,5 +18,43 @@
 * @since 2024-12-02
 */
public interface MwStagingRoomService extends IService<MwStagingRoom> {
    /**
     * 暂存间分页列表
     *
     * @param query
     * @return
     */
    PageDTO<MwStagingRoomVO> pageList(MwStagingRoomQuery query);
    /**
     * 新增暂存间
     *
     * @param dto
     * @return
     */
    void add(MwStagingRoomDTO dto);
    /**
     * 编辑暂存间
     *
     * @param dto
     * @return
     */
    void edit(MwStagingRoomDTO dto);
    /**
     * 根据医院id查询暂存间
     *
     * @param departmentId
     * @return
     */
    MwStagingRoomVO getByHospitalId(Long departmentId);
    /**
     * 暂存间入库记录
     *
     * @param query
     * @return
     */
    PageDTO<MwCollectRecordVO> storageRecord(StorageRecordQuery query);
}
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwBoxServiceImpl.java
@@ -1,10 +1,29 @@
package com.sinata.system.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sinata.common.entity.PageDTO;
import com.sinata.common.enums.BoxProcessEnum;
import com.sinata.common.enums.BoxStatusEnum;
import com.sinata.common.exception.ServiceException;
import com.sinata.common.utils.BeanUtils;
import com.sinata.common.utils.CollUtils;
import com.sinata.common.utils.StringUtils;
import com.sinata.system.domain.MwBox;
import com.sinata.system.domain.dto.MwBoxDTO;
import com.sinata.system.domain.query.MwBoxPageQuery;
import com.sinata.system.domain.vo.BoxStatisticsVO;
import com.sinata.system.domain.vo.MwBoxVO;
import com.sinata.system.mapper.MwBoxMapper;
import com.sinata.system.service.MwBoxService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
 * <p>
@@ -16,5 +35,91 @@
 */
@Service
public class MwBoxServiceImpl extends ServiceImpl<MwBoxMapper, MwBox> implements MwBoxService {
    /**
     * 转运箱数据统计
     *
     * @return
     */
    @Override
    public BoxStatisticsVO getBoxStatistics() {
        BoxStatisticsVO boxStatisticsVO = new BoxStatisticsVO();
        List<MwBox> boxList = this.list();
        if (CollUtils.isNotEmpty(boxList)) {
            boxStatisticsVO.setTotal(boxList.size());
            boxStatisticsVO.setBrokenCount(boxList.stream().filter(box -> BoxStatusEnum.BROKEN.getCode().equals(box.getStatus())).count());
            boxStatisticsVO.setLostCount(boxList.stream().filter(box -> BoxStatusEnum.LOST.getCode().equals(box.getStatus())).count());
            boxStatisticsVO.setDisposeCount(boxList.stream().filter(box -> BoxProcessEnum.DISPOSAL.getCode().equals(box.getStatus())).count());
            boxStatisticsVO.setHospitalUsingCount(boxList.stream().filter(box -> BoxProcessEnum.HOSPITAL_USING.getCode().equals(box.getStatus())).count());
            boxStatisticsVO.setTransitingCount(boxList.stream().filter(box -> BoxProcessEnum.TRANSITING.getCode().equals(box.getStatus())).count());
        }
        return boxStatisticsVO;
    }
    /**
     * 转运箱分页列表
     *
     * @param query
     * @return
     */
    @Override
    public PageDTO<MwBoxVO> pageList(MwBoxPageQuery query) {
        Page<MwBox> page = this.lambdaQuery()
                .between(StringUtils.isNotBlank(query.getBoxNumberStart())
                                && StringUtils.isNotBlank(query.getBoxNumberEnd()),
                        MwBox::getBoxNumber, query.getBoxNumberStart(), query.getBoxNumberEnd())
                .eq(Objects.nonNull(query.getStatus()), MwBox::getStatus, query.getStatus())
                .eq(Objects.nonNull(query.getLink()), MwBox::getLink, query.getLink())
                .between(Objects.nonNull(query.getLastUseTimeStart())
                                && Objects.nonNull(query.getLastUseTimeEnd()),
                        MwBox::getLastUseTime, query.getLastUseTimeStart(), query.getLastUseTimeEnd())
                .orderByDesc(MwBox::getBoxNumber)
                .page(new Page<>(query.getPageCurr(), query.getPageSize()));
        return PageDTO.of(page, MwBoxVO.class);
    }
    /**
     * 新增转运箱
     *
     * @param boxNumberStart
     * @param boxNumberEnd
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void add(String boxNumberStart, String boxNumberEnd) {
        String regx = "\\d+";
        if (boxNumberStart.length() != 11 || boxNumberEnd.length() != 11 || !boxNumberStart.matches(regx) || !boxNumberEnd.matches(regx)) {
            throw new ServiceException("请输入有效的11位数字编号!");
        }
        BigDecimal start = new BigDecimal(boxNumberStart);
        BigDecimal end = new BigDecimal(boxNumberEnd);
        if (start.compareTo(end) > 0) {
            throw new ServiceException("开始编号不能大于结束编号");
        }
        List<MwBox> boxList = new ArrayList<>();
        for (BigDecimal i = start; i.compareTo(end) <= 0; i = i.add(BigDecimal.ONE)) {
            MwBox mwBox = new MwBox();
            mwBox.setBoxNumber(i.toString());
            mwBox.setStatus(BoxStatusEnum.NORMAL.getCode());
            boxList.add(mwBox);
        }
        try {
            this.saveBatch(boxList);
        } catch (DuplicateKeyException e) {
            throw new ServiceException("转运箱编号重复");
        }
    }
    /**
     * 编辑转运箱状态
     *
     * @param dto
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void editBatch(List<MwBoxDTO> dtoList) {
        List<MwBox> mwBoxes = BeanUtils.copyToList(dtoList, MwBox.class);
        this.updateBatchById(mwBoxes);
    }
}
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwStagingRoomServiceImpl.java
@@ -1,10 +1,24 @@
package com.sinata.system.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sinata.common.entity.PageDTO;
import com.sinata.common.exception.ServiceException;
import com.sinata.common.utils.BeanUtils;
import com.sinata.system.domain.MwStagingRoom;
import com.sinata.system.domain.SysDepartment;
import com.sinata.system.domain.dto.MwStagingRoomDTO;
import com.sinata.system.domain.query.MwStagingRoomQuery;
import com.sinata.system.domain.query.StorageRecordQuery;
import com.sinata.system.domain.vo.MwCollectRecordVO;
import com.sinata.system.domain.vo.MwStagingRoomVO;
import com.sinata.system.mapper.MwStagingRoomMapper;
import com.sinata.system.service.MwStagingRoomService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sinata.system.service.SysDepartmentService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Objects;
/**
 * <p>
@@ -15,6 +29,79 @@
 * @since 2024-12-02
 */
@Service
@RequiredArgsConstructor
public class MwStagingRoomServiceImpl extends ServiceImpl<MwStagingRoomMapper, MwStagingRoom> implements MwStagingRoomService {
    private final SysDepartmentService sysDepartmentService;
    /**
     * 暂存间分页列表
     *
     * @param query
     * @return
     */
    @Override
    public PageDTO<MwStagingRoomVO> pageList(MwStagingRoomQuery query) {
        String treeCode = "";
        if (Objects.nonNull(query.getDepartmentId())) {
            SysDepartment department = sysDepartmentService.getById(query.getDepartmentId());
            if (Objects.isNull(department)) {
                return PageDTO.empty(0L, 0L);
            }
            treeCode = department.getTreeCode();
        }
        Page<MwStagingRoomVO> page = baseMapper.pagelist(new Page<>(query.getPageCurr(), query.getPageSize()), query.getDepartmentId(), treeCode);
        return PageDTO.of(page);
    }
    /**
     * 新增暂存间
     *
     * @param dto
     * @return
     */
    @Override
    public void add(MwStagingRoomDTO dto) {
        MwStagingRoom mwStagingRoom = BeanUtils.copyBean(dto, MwStagingRoom.class);
        Long count = this.lambdaQuery().eq(MwStagingRoom::getDepartmentId, mwStagingRoom.getDepartmentId()).count();
        if (count > 0) {
            throw new ServiceException("当前医院已存在暂存间,请勿重复添加");
        }
        save(mwStagingRoom);
    }
    /**
     * 编辑暂存间
     *
     * @param dto
     * @return
     */
    @Override
    public void edit(MwStagingRoomDTO dto) {
        if (Objects.isNull(dto.getId())) {
            throw new ServiceException("暂存间id不能为空");
        }
    }
    /**
     * 根据医院id查询暂存间
     *
     * @param departmentId
     * @return
     */
    @Override
    public MwStagingRoomVO getByHospitalId(Long departmentId) {
        MwStagingRoom one = this.lambdaQuery().eq(MwStagingRoom::getDepartmentId, departmentId).one();
        return BeanUtils.copyBean(one, MwStagingRoomVO.class);
    }
    /**
     * 暂存间入库记录
     *
     * @param query
     * @return
     */
    @Override
    public PageDTO<MwCollectRecordVO> storageRecord(StorageRecordQuery query) {
        return null;
    }
}
medicalWaste-system/src/main/resources/mapper/system/MwStagingRoomMapper.xml
@@ -24,5 +24,32 @@
        UPDATE_TIME,
        ID, DEPARTMENT_ID, ROOM_NAME, MAX_CAPACITY
    </sql>
    <select id="pagelist" resultType="com.sinata.system.domain.vo.MwStagingRoomVO">
        SELECT msr.ID,
        msr.DEPARTMENT_ID,
        msr.ROOM_NAME,
        msr.MAX_CAPACITY,
        msr.CREATE_TIME,
        COUNT(mr.ID) AS usedNum,
        (msr.MAX_CAPACITY - COUNT(mr.ID)) AS unUsedNum,
        sd.DEPARTMENT_NAME AS hospitalName
        FROM MW_STAGING_ROOM msr
        LEFT JOIN (SELECT ID,
        BOX_ID,
        STAGING_ROOM_ID
        FROM MW_COLLECT_RECORD
        WHERE STATUS != 4
        GROUP BY BOX_ID) mr
        ON msr.ID = mr.STAGING_ROOM_ID
        LEFT JOIN SYS_DEPARTMENT sd ON msr.DEPARTMENT_ID = sd.ID
        <where>
            <if test="departmentId != null and departmentId != ''">
                msr.DEPARTMENT_ID = #{departmentId}
            </if>
            <if test="treeCode != null and treeCode != ''">
                sd.TREE_CODE LIKE CONCAT('%', #{tree})
            </if>
        </where>
    </select>
</mapper>