diff --git a/src/main/java/com/syjiaer/clinic/server/common/constants/Constants.java b/src/main/java/com/syjiaer/clinic/server/common/constants/Constants.java
new file mode 100644
index 0000000..214e3c9
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/constants/Constants.java
@@ -0,0 +1,14 @@
+package com.syjiaer.clinic.server.common.constants;
+
+public class Constants {
+ public static final String IPurchaseCodePrefix = "IP";
+ public static final String IInitCodePrefix = "II";
+ public static final String RetailFeedetlSn = "FFLS";
+ public static final Integer DetailPageSize = 20;
+
+ public static final String InitInventory = "初始化库存";
+ public static final String PurchaseInventory = "采购入库";
+ public static final String Sold = "售出";
+ public static final String Apply = "领用";
+ public static final String Social = "医保";
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/GoodUploadInterfaceEnum.java b/src/main/java/com/syjiaer/clinic/server/common/enums/GoodUploadInterfaceEnum.java
new file mode 100644
index 0000000..9beba2f
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/GoodUploadInterfaceEnum.java
@@ -0,0 +1,29 @@
+package com.syjiaer.clinic.server.common.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum GoodUploadInterfaceEnum {
+ GoodsRecord(3501,"商品盘存"),
+ GoodsInventoryNumChange(3502,"商品库存变更"),
+ GoodsPurchase(3503,"商品采购"),
+ GoodsReturn(3504,"商品采购退货"),
+ GoodsSale(3505,"商品销售"),
+ GoodsSaleReturn(3506,"商品销售退货"),
+ GoodsDel(3507,"商品删除");
+ private final Integer interfaceNum;
+ private final String desc;
+
+ GoodUploadInterfaceEnum(Integer interfaceNum, String desc) {
+ this.interfaceNum = interfaceNum;
+ this.desc = desc;
+ }
+ public static GoodUploadInterfaceEnum getByInterfaceNum(Integer interfaceNum) {
+ for (GoodUploadInterfaceEnum value : GoodUploadInterfaceEnum.values()) {
+ if (value.getInterfaceNum().equals(interfaceNum)) {
+ return value;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/GoodsPricingModelEnum.java b/src/main/java/com/syjiaer/clinic/server/common/enums/GoodsPricingModelEnum.java
new file mode 100644
index 0000000..d6c981b
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/GoodsPricingModelEnum.java
@@ -0,0 +1,24 @@
+package com.syjiaer.clinic.server.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum GoodsPricingModelEnum {
+ Fixed(0,"固定售价"),
+ Bonus(1,"进价加成");
+ private final Integer pricingModel;
+ private final String desc;
+ public static GoodsPricingModelEnum getByPricingModel(Integer pricingModel)
+ {
+ for (GoodsPricingModelEnum value : values())
+ {
+ if (value.getPricingModel().equals(pricingModel))
+ {
+ return value;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/GoodsTrdnFlagEnum.java b/src/main/java/com/syjiaer/clinic/server/common/enums/GoodsTrdnFlagEnum.java
new file mode 100644
index 0000000..7cb84e7
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/GoodsTrdnFlagEnum.java
@@ -0,0 +1,15 @@
+package com.syjiaer.clinic.server.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum GoodsTrdnFlagEnum {
+ Allow(1,"允许拆零"),
+ NotAllow(0,"不允许拆零");
+
+ private final Integer trdnFlag;
+ private final String desc;
+
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/GoodsTypeEnum.java b/src/main/java/com/syjiaer/clinic/server/common/enums/GoodsTypeEnum.java
new file mode 100644
index 0000000..7b9bc39
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/GoodsTypeEnum.java
@@ -0,0 +1,33 @@
+package com.syjiaer.clinic.server.common.enums;
+
+public enum GoodsTypeEnum {
+ otherGoods(0,"其他商品"),
+ patentMedicine(1301,"中西成药"),
+ chineseMedicine(1302,"中药饮片"),
+ medicalEquipment(1306,"医疗器材");
+
+ private final Integer type;
+ private final String desc;
+
+ GoodsTypeEnum(final Integer type, final String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public static GoodsTypeEnum getByType(Integer type) {
+ for (GoodsTypeEnum goodsTypeEnum : GoodsTypeEnum.values()) {
+ if (goodsTypeEnum.getType().equals(type)) {
+ return goodsTypeEnum;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/InventoryRefererTypeEnum.java b/src/main/java/com/syjiaer/clinic/server/common/enums/InventoryRefererTypeEnum.java
new file mode 100644
index 0000000..0a97097
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/InventoryRefererTypeEnum.java
@@ -0,0 +1,22 @@
+package com.syjiaer.clinic.server.common.enums;
+
+public enum InventoryRefererTypeEnum {
+ INIT(0, "库存初始化"),
+ STORE(1, "采购入库");
+
+ private Integer type;
+ private String desc;
+
+ InventoryRefererTypeEnum(Integer type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/InventorySocialTypeEnum.java b/src/main/java/com/syjiaer/clinic/server/common/enums/InventorySocialTypeEnum.java
new file mode 100644
index 0000000..6f6407b
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/InventorySocialTypeEnum.java
@@ -0,0 +1,34 @@
+package com.syjiaer.clinic.server.common.enums;
+
+
+import lombok.Getter;
+
+@Getter
+public enum InventorySocialTypeEnum {
+
+ TRANSFER_INBOUND(101, "调拨入库"),
+ DISPATCH_OUTBOUND(102, "调拨出库"),
+ INVENTORY_SURPLUS(103, "盘盈"),
+ INVENTORY_LOSS(104, "盘损"),
+ DESTRUCTION(105, "销毁"),
+ OTHER_INBOUND(106, "其他入库"),
+ OTHER_OUTBOUND(107, "其他出库"),
+ INITIAL_INBOUND(108, "初始化入库");
+ private final Integer type;
+ private final String desc;
+
+ InventorySocialTypeEnum(Integer type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ public static InventorySocialTypeEnum getByType(Integer type) {
+ for (InventorySocialTypeEnum inventorySocialTypeEnum : values()) {
+ if (inventorySocialTypeEnum.getType().equals(type)){
+ return inventorySocialTypeEnum;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/InventoryTypeEnum.java b/src/main/java/com/syjiaer/clinic/server/common/enums/InventoryTypeEnum.java
new file mode 100644
index 0000000..56872f7
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/InventoryTypeEnum.java
@@ -0,0 +1,35 @@
+package com.syjiaer.clinic.server.common.enums;
+
+
+import lombok.Getter;
+
+@Getter
+public enum InventoryTypeEnum {
+
+ INIT(1, "初始化"),
+ PURCHASE_IN(2, "采购入库"),
+ CHECK_IN(3, "盘盈入库"),
+ GRANT_OUT(4, "发药出库"),
+ APPLY_OUT(5, "领用出库"),
+ FORMLOSS_OUT(6, "报损出库"),
+ CHECK_OUT(7, "盘亏出库"),
+ RETURN_OUT(8, "退货出库"),
+ REFUND_IN(9, "零售退款入库");
+ private final Integer type;
+ private final String desc;
+
+ InventoryTypeEnum(Integer type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ public static InventoryTypeEnum getByType(Integer type) {
+ for (InventoryTypeEnum inventorySocialTypeEnum : values()) {
+ if (inventorySocialTypeEnum.getType().equals(type)){
+ return inventorySocialTypeEnum;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/MedicalRecordDetailTypeEnum.java b/src/main/java/com/syjiaer/clinic/server/common/enums/MedicalRecordDetailTypeEnum.java
new file mode 100644
index 0000000..4e42683
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/MedicalRecordDetailTypeEnum.java
@@ -0,0 +1,25 @@
+package com.syjiaer.clinic.server.common.enums;
+
+public enum MedicalRecordDetailTypeEnum {
+
+ item(1,"服务项目"),
+ goods(2,"药品耗材");
+
+ private final Integer type;
+ private final String desc;
+
+ MedicalRecordDetailTypeEnum(final Integer type, final String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/RetailOrderPayTypeEnum.java b/src/main/java/com/syjiaer/clinic/server/common/enums/RetailOrderPayTypeEnum.java
new file mode 100644
index 0000000..8ebbb9c
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/RetailOrderPayTypeEnum.java
@@ -0,0 +1,34 @@
+package com.syjiaer.clinic.server.common.enums;
+
+public enum RetailOrderPayTypeEnum {
+ MEDICARE(1, "医保支付"),
+ WXPAY(2, "微信"),
+ ALIPAY(3, "支付宝"),
+ CASH(4, "现金"),
+ OTHER(5, "其他");;
+
+ private Integer code;
+ private String desc;
+
+ RetailOrderPayTypeEnum(Integer code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+ public static RetailOrderPayTypeEnum getByCode(Integer code){
+ for (RetailOrderPayTypeEnum retailOrderPayTypeEnum : RetailOrderPayTypeEnum.values()) {
+ if (retailOrderPayTypeEnum.getCode().equals(code)) {
+ return retailOrderPayTypeEnum;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/RetailOrderStatusEnum.java b/src/main/java/com/syjiaer/clinic/server/common/enums/RetailOrderStatusEnum.java
new file mode 100644
index 0000000..08c2b25
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/RetailOrderStatusEnum.java
@@ -0,0 +1,24 @@
+package com.syjiaer.clinic.server.common.enums;
+
+public enum RetailOrderStatusEnum {
+ UNFINISHED(0, "未完成"),
+ FINISHED(1, "已完成"),
+ CANCELLED(2, "已取消"),
+ REFUNDED(3, "已退款");
+
+ private Integer code;
+ private String desc;
+
+ RetailOrderStatusEnum(Integer code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/Type.java b/src/main/java/com/syjiaer/clinic/server/common/enums/Type.java
new file mode 100644
index 0000000..81cb9bd
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/Type.java
@@ -0,0 +1,6 @@
+package com.syjiaer.clinic.server.common.enums;
+
+public enum Type {
+ IN,
+ OUT
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/UploadStatusEnum.java b/src/main/java/com/syjiaer/clinic/server/common/enums/UploadStatusEnum.java
new file mode 100644
index 0000000..e051a20
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/UploadStatusEnum.java
@@ -0,0 +1,33 @@
+package com.syjiaer.clinic.server.common.enums;
+
+public enum UploadStatusEnum {
+ NoUpload(0, "未上传"),
+ Uploaded(1, "已上传"),
+ UploadFailed(2, "上传失败"),
+ NotNeedUpload(3, "无需上传");
+
+ private final Integer status;
+ private final String desc;
+
+ UploadStatusEnum(Integer status, String desc) {
+ this.status = status;
+ this.desc = desc;
+ }
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public static UploadStatusEnum getByStatus(Integer status) {
+ for (UploadStatusEnum uploadStatusEnum : UploadStatusEnum.values()) {
+ if (uploadStatusEnum.getStatus().equals(status)) {
+ return uploadStatusEnum;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/UserStatusEnum.java b/src/main/java/com/syjiaer/clinic/server/common/enums/UserStatusEnum.java
new file mode 100644
index 0000000..4f40386
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/UserStatusEnum.java
@@ -0,0 +1,23 @@
+package com.syjiaer.clinic.server.common.enums;
+
+public enum UserStatusEnum {
+ ENABLED(0, "启用"),
+ DISABLED(1, "禁用");
+
+ private int status;
+ private String desc;
+
+ UserStatusEnum(int status, String desc) {
+ this.status = status;
+ this.desc = desc;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/common/enums/UserTypeEnum.java b/src/main/java/com/syjiaer/clinic/server/common/enums/UserTypeEnum.java
new file mode 100644
index 0000000..cd7afb5
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/common/enums/UserTypeEnum.java
@@ -0,0 +1,31 @@
+package com.syjiaer.clinic.server.common.enums;
+
+public enum UserTypeEnum {
+ ADMIN(0, "管理员"),
+ USER(1, "普通用户"),
+ DOCTOR(2, "医生");
+
+ private int type;
+ private String desc;
+
+ UserTypeEnum(int type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+ public static UserTypeEnum getByCode(int code) {
+ for (UserTypeEnum item : UserTypeEnum.values()) {
+ if (item.getType() == code) {
+ return item;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/entity/goods/Goods.java b/src/main/java/com/syjiaer/clinic/server/entity/goods/Goods.java
new file mode 100644
index 0000000..d8898a6
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/entity/goods/Goods.java
@@ -0,0 +1,130 @@
+package com.syjiaer.clinic.server.entity.goods;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+/**
+ *
+ * 商品主表
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-04-11
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@ApiModel(value = "Goods对象", description = "商品主表")
+public class Goods implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("自增主键")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("商品名称")
+ private String name;
+
+ @ApiModelProperty("商品类型")
+ private Integer type;
+
+ @ApiModelProperty("通用名")
+ private String commonName;
+
+ @ApiModelProperty("医保目录编码")
+ private String hilistCode;
+
+ @ApiModelProperty("单价")
+ private BigDecimal unitPrice;
+
+ @ApiModelProperty("进货价")
+ private BigDecimal purchaseUnitPrice;
+
+ @ApiModelProperty("生厂商")
+ private String producer;
+
+ @ApiModelProperty("条形码")
+ private String barcode;
+
+ @ApiModelProperty("最小制剂单位")
+ private String medicineDosageUnit;
+
+ @ApiModelProperty("最小包装数量")
+ private Integer minPackagingNumber;
+
+ @ApiModelProperty("最小包装单位")
+ private String minPackagingUnit;
+
+ @ApiModelProperty("保质期")
+ private Integer expiryTime;
+
+ @ApiModelProperty("国药准字")
+ private String approvalCode;
+
+ @ApiModelProperty("拓展字段")
+ private String extra;
+
+ @ApiModelProperty("分类ID")
+ private Integer cateId;
+
+ @ApiModelProperty("软删除 1为删除")
+ private Integer deleted;
+
+ @ApiModelProperty("利润分类")
+ private String profitCate;
+
+ @ApiModelProperty("标签")
+ private String tags;
+
+ @ApiModelProperty("备注")
+ private String remark;
+
+ @ApiModelProperty("利率")
+ private Double interestRate;
+
+ @ApiModelProperty("库存整数量 ")
+ private Integer inventoryWholeNumber;
+
+ @ApiModelProperty("标识码 由追溯码生成")
+ private String idCode;
+
+ @ApiModelProperty("库存分数量")
+ private Integer inventoryFragmentNumber;
+
+ @ApiModelProperty("0不允许拆零 1允许拆零")
+ private Boolean trdnFlag;
+
+ @ApiModelProperty("拆零价格")
+ private BigDecimal disassemblyPrice;
+
+ @ApiModelProperty("最小制剂数量")
+ private String medicineDosageNum;
+
+ @ApiModelProperty("包装单位")
+ private String packagingUnit;
+
+ @ApiModelProperty("售卖模式")
+ private Integer pricingModel;
+
+ @ApiModelProperty("加成率 30=30%")
+ private Integer makeUp;
+
+ @ApiModelProperty("0禁售 1可售")
+ private Boolean status;
+
+ @ApiModelProperty("库存预警数量")
+ private Integer inventoryWarnNumber;
+
+ @ApiModelProperty("到期预警天数")
+ private Integer expiryWarnDays;
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/entity/goods/GoodsCate.java b/src/main/java/com/syjiaer/clinic/server/entity/goods/GoodsCate.java
new file mode 100644
index 0000000..8f8b8ff
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/entity/goods/GoodsCate.java
@@ -0,0 +1,72 @@
+package com.syjiaer.clinic.server.entity.goods;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+
+import java.io.Serializable;
+/**
+ *
+ *
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-03-04
+ */
+@TableName("goods_cate")
+@ApiModel(value = "GoodsCate对象", description = "")
+public class GoodsCate implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+ private String name;
+
+ private Integer type;
+
+ private Integer sort;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+
+ public Integer getSort() {
+ return sort;
+ }
+
+ public void setSort(Integer sort) {
+ this.sort = sort;
+ }
+
+ @Override
+ public String toString() {
+ return "GoodsCate{" +
+ "id = " + id +
+ ", name = " + name +
+ ", type = " + type +
+ ", sort = " + sort +
+ "}";
+ }
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/entity/goods/GoodsView.java b/src/main/java/com/syjiaer/clinic/server/entity/goods/GoodsView.java
new file mode 100644
index 0000000..5a4e19d
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/entity/goods/GoodsView.java
@@ -0,0 +1,93 @@
+package com.syjiaer.clinic.server.entity.goods;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+/**
+ *
+ *
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-04-07
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("goods_view")
+@ApiModel(value = "GoodsView对象", description = "")
+public class GoodsView implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private Integer id;
+
+ private String name;
+
+ private Integer type;
+
+ private String commonName;
+
+ private String hilistCode;
+
+ private BigDecimal unitPrice;
+
+ private BigDecimal purchaseUnitPrice;
+
+ private String producer;
+
+ private String barcode;
+
+ private String medicineDosageUnit;
+
+ private Integer minPackagingNumber;
+
+ private String minPackagingUnit;
+
+ private Integer expiryTime;
+
+ private String approvalCode;
+
+ private String extra;
+
+ private Integer cateId;
+
+ private Integer deleted;
+
+ private String profitCate;
+
+ private String tags;
+
+ private String remark;
+
+ private Double interestRate;
+
+ private Integer inventoryWholeNumber;
+
+ private String idCode;
+
+ private Integer inventoryFragmentNumber;
+
+ private Boolean trdnFlag;
+
+ private BigDecimal disassemblyPrice;
+
+ private String medicineDosageNum;
+
+ private String packagingUnit;
+
+ private Integer pricingModel;
+
+ private Integer makeUp;
+
+ private Boolean status;
+
+ private String cateName;
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/entity/goods/dto/GoodsQuery.java b/src/main/java/com/syjiaer/clinic/server/entity/goods/dto/GoodsQuery.java
new file mode 100644
index 0000000..4e6c15e
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/entity/goods/dto/GoodsQuery.java
@@ -0,0 +1,28 @@
+package com.syjiaer.clinic.server.entity.goods.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+@Setter
+@Getter
+public class GoodsQuery {
+
+ private String name;
+ private Integer cateId;
+ private Integer minInterestRate;
+ private Integer maxInterestRate;
+ private Integer inventoryNumber;
+ private boolean status;
+ private Integer pageSize;
+ private Integer pageNum;
+ private List interestRateIntervalList;
+
+ @Setter
+ @Getter
+ public class interestRateInterval {
+ private Double min;
+ private Double max;
+
+ }
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/entity/goods/vo/GoodsDetailVo.java b/src/main/java/com/syjiaer/clinic/server/entity/goods/vo/GoodsDetailVo.java
new file mode 100644
index 0000000..6bf11b9
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/entity/goods/vo/GoodsDetailVo.java
@@ -0,0 +1,86 @@
+package com.syjiaer.clinic.server.entity.goods.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Getter
+@Setter
+public class GoodsDetailVo {
+ private Integer id;
+
+ private String name;
+
+ private Integer type;
+
+ private String commonName;
+
+ private String hilistCode;
+
+ private BigDecimal unitPrice;
+
+ private BigDecimal purchaseUnitPrice ;
+
+ private String producer;
+
+ private String barcode;
+
+ private String medicineDosageUnit;
+
+ private Integer minPackagingNumber;
+
+ private String minPackagingUnit;
+
+ private Integer expiryTime;
+
+ private String approvalCode;
+
+ private String extra;
+
+ private Integer cateId;
+
+ private Integer deleted;
+
+ private String profitCate;
+
+ private String tags;
+
+ private String remark;
+
+ private Double interestRate;
+
+ private Integer inventoryWholeNumber;
+
+ private String idCode;
+
+ private Integer inventoryFragmentNumber;
+
+ private Boolean trdnFlag;
+
+ private BigDecimal disassemblyPrice;
+
+ private String medicineDosageNum;
+
+ private String packagingUnit;
+
+ private Integer pricingModel;
+
+ private Integer makeUp;
+
+ private Boolean status;
+
+ private String cateName;
+
+ //最近效期
+ private LocalDate recentlyExpiryDate ;
+ //药品成本
+ private BigDecimal costPrice = BigDecimal.ZERO;
+ //医保限价
+ private BigDecimal hilistPricUplmtAmt = BigDecimal.ZERO;
+ //支付比例
+ private BigDecimal selfpayProp;
+ //限制说明
+ private String hilistLmtpricType;
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/entity/medical/MedicalRecord.java b/src/main/java/com/syjiaer/clinic/server/entity/medical/MedicalRecord.java
new file mode 100644
index 0000000..f4ed94d
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/entity/medical/MedicalRecord.java
@@ -0,0 +1,68 @@
+package com.syjiaer.clinic.server.entity.medical;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+/**
+ *
+ *
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-04-17
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("medical_record")
+@ApiModel(value = "MedicalRecord对象", description = "")
+public class MedicalRecord implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("自增id")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("患者id")
+ private Integer patientId;
+
+ @ApiModelProperty("主诉")
+ private String mainAppeal;
+
+ @ApiModelProperty("现病史")
+ private String nowMedicalHistory;
+
+ @ApiModelProperty("往病史")
+ private String beforeMedicalHistory;
+
+ @ApiModelProperty("过敏史")
+ private String allergyHistory;
+
+ @ApiModelProperty("体检检查")
+ private String exam;
+
+ @ApiModelProperty("非通用字段")
+ private String json;
+
+ @ApiModelProperty("接诊医生id")
+ private Integer dockerId;
+
+ @ApiModelProperty("接诊医生姓名")
+ private String dockerName;
+
+ @ApiModelProperty("诊断详细数据")
+ private String diagnosisDetail;
+
+ @ApiModelProperty("诊断概况")
+ private String diagnosisSummary;
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/entity/medical/MedicalRecordDetail.java b/src/main/java/com/syjiaer/clinic/server/entity/medical/MedicalRecordDetail.java
new file mode 100644
index 0000000..f0cfe4f
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/entity/medical/MedicalRecordDetail.java
@@ -0,0 +1,60 @@
+package com.syjiaer.clinic.server.entity.medical;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+/**
+ *
+ *
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-04-17
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("medical_record_detail")
+@ApiModel(value = "MedicalRecordDetail对象", description = "")
+public class MedicalRecordDetail implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("自增主键")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("项目id(项目包含 goods表 item 表)")
+ private Integer projectId;
+
+ @ApiModelProperty("项目名称")
+ private String projectName;
+
+ @ApiModelProperty("项目医保码")
+ private String projectSocialCode;
+
+ @ApiModelProperty("项目单位")
+ private String projectUnit;
+
+ @ApiModelProperty("项目单价")
+ private BigDecimal projectUnitPrice;
+
+ @ApiModelProperty("病例id")
+ private Integer medicalRecordId;
+
+ @ApiModelProperty("1 服务项目(item表) 2药品(goods表)")
+ private Integer type;
+
+ @ApiModelProperty("药品数量(type=2时不能为空)")
+ private Integer number;
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/entity/medical/dto/MedicalRecordSaveDto.java b/src/main/java/com/syjiaer/clinic/server/entity/medical/dto/MedicalRecordSaveDto.java
new file mode 100644
index 0000000..e588608
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/entity/medical/dto/MedicalRecordSaveDto.java
@@ -0,0 +1,52 @@
+package com.syjiaer.clinic.server.entity.medical.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+import java.util.Map;
+@Getter
+@Setter
+public class MedicalRecordSaveDto {
+ @ApiModelProperty("自增id")
+ private Integer id;
+
+ @ApiModelProperty("患者id")
+ private Integer patientId;
+
+ @ApiModelProperty("主诉")
+ private String mainAppeal;
+
+ @ApiModelProperty("现病史")
+ private String nowMedicalHistory;
+
+ @ApiModelProperty("往病史")
+ private String beforeMedicalHistory;
+
+ @ApiModelProperty("过敏史")
+ private String allergyHistory;
+
+ @ApiModelProperty("体检检查")
+ private String exam;
+
+ @ApiModelProperty("非通用字段")
+ private String json;
+
+ @ApiModelProperty("接诊医生id")
+ private Integer dockerId;
+
+ @ApiModelProperty("接诊医生姓名")
+ private String dockerName;
+
+ @ApiModelProperty("诊断详细数据")
+ private String diagnosisDetail;
+
+ @ApiModelProperty("诊断概况")
+ private String diagnosisSummary;
+
+ @ApiModelProperty("服务项目列表")
+ private List itemList;
+ @ApiModelProperty("药品耗材列表")
+ private Map goodsMap;
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/entity/patient/PatientInfo.java b/src/main/java/com/syjiaer/clinic/server/entity/patient/PatientInfo.java
new file mode 100644
index 0000000..2975c01
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/entity/patient/PatientInfo.java
@@ -0,0 +1,51 @@
+package com.syjiaer.clinic.server.entity.patient;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 患者信息
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-04-17
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("patient_info")
+@ApiModel(value = "PatientInfo对象", description = "患者信息 ")
+public class PatientInfo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("自增id")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("患者姓名")
+ private String name;
+
+ @ApiModelProperty("手机号")
+ private String phone;
+
+ @ApiModelProperty("身份证号")
+ private String certno;
+
+ @ApiModelProperty("性别")
+ private String sex;
+
+ @ApiModelProperty("年龄")
+ private Integer age;
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/entity/patient/PatientRegistration.java b/src/main/java/com/syjiaer/clinic/server/entity/patient/PatientRegistration.java
new file mode 100644
index 0000000..a97fa96
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/entity/patient/PatientRegistration.java
@@ -0,0 +1,73 @@
+package com.syjiaer.clinic.server.entity.patient;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 挂号表
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-04-10
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("patient_registration")
+@ApiModel(value = "Registration对象", description = "挂号表")
+public class PatientRegistration implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("科室id")
+ private Integer organizationSectionId;
+
+ @ApiModelProperty("医生id")
+ private Integer organizationDoctorId;
+
+ @ApiModelProperty("就诊类型")
+ private Integer visitType;
+
+ @ApiModelProperty("挂号时间")
+ private LocalDateTime createDatetime;
+
+ @ApiModelProperty("推荐")
+ private String recommendations;
+
+ @ApiModelProperty("备注")
+ private String memo;
+
+ @ApiModelProperty("预诊")
+ private String advanceDiagnosis;
+
+ @ApiModelProperty("挂号费")
+ private BigDecimal registrationMoney;
+
+ @ApiModelProperty("逻辑删除")
+ private Integer delFlag;
+
+ @ApiModelProperty("挂号类型")
+ private Integer type;
+
+ @ApiModelProperty("病人id")
+ private Integer patientInfoId;
+
+ @ApiModelProperty("挂号状态 1候诊 2在诊 3已诊 0取消")
+ private Integer status;
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/entity/patient/dto/RegistrationQuery.java b/src/main/java/com/syjiaer/clinic/server/entity/patient/dto/RegistrationQuery.java
new file mode 100644
index 0000000..7d11da9
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/entity/patient/dto/RegistrationQuery.java
@@ -0,0 +1,13 @@
+package com.syjiaer.clinic.server.entity.patient.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class RegistrationQuery {
+ private Integer status;
+ private Integer pageNum ;
+ private Integer pageSize ;
+ private String keyword;
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/entity/patient/param/PatientRegistrationParam.java b/src/main/java/com/syjiaer/clinic/server/entity/patient/param/PatientRegistrationParam.java
new file mode 100644
index 0000000..783aa4d
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/entity/patient/param/PatientRegistrationParam.java
@@ -0,0 +1,63 @@
+package com.syjiaer.clinic.server.entity.patient.param;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class PatientRegistrationParam {
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("科室id")
+ private Integer organizationSectionId;
+
+ @ApiModelProperty("医生id")
+ private Integer organizationDoctorId;
+
+ @ApiModelProperty("患者姓名")
+ private String name;
+
+ @ApiModelProperty("患者年龄")
+ private Integer age;
+
+ @ApiModelProperty("患者手机号")
+ private String phone;
+
+ @ApiModelProperty("就诊类型")
+ private Short visitType;
+
+ @ApiModelProperty("挂号时间")
+ private LocalDateTime createDatetime;
+
+ @ApiModelProperty("推荐")
+ private String recommendations;
+
+ @ApiModelProperty("备注")
+ private String memo;
+
+ @ApiModelProperty("预诊")
+ private String advanceDiagnosis;
+
+ @ApiModelProperty("挂号费")
+ private BigDecimal registrationMoney;
+
+ @ApiModelProperty("逻辑删除")
+ private Short delFlag;
+
+ @ApiModelProperty("挂号类型")
+ private Short type;
+
+ @ApiModelProperty("性别")
+ private String gender;
+
+ @ApiModelProperty("病人id")
+ private Integer patientInfoId;
+
+ @ApiModelProperty("挂号状态 1候诊 2在诊 3已诊 0取消")
+ private Integer status;
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/mapper/goods/GoodsCateMapper.java b/src/main/java/com/syjiaer/clinic/server/mapper/goods/GoodsCateMapper.java
new file mode 100644
index 0000000..858b023
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/mapper/goods/GoodsCateMapper.java
@@ -0,0 +1,18 @@
+package com.syjiaer.clinic.server.mapper.goods;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.syjiaer.clinic.server.entity.goods.GoodsCate;
+
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-03-04
+ */
+public interface GoodsCateMapper extends BaseMapper {
+
+}
+
diff --git a/src/main/java/com/syjiaer/clinic/server/mapper/goods/GoodsMapper.java b/src/main/java/com/syjiaer/clinic/server/mapper/goods/GoodsMapper.java
new file mode 100644
index 0000000..7cd664b
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/mapper/goods/GoodsMapper.java
@@ -0,0 +1,15 @@
+package com.syjiaer.clinic.server.mapper.goods;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.syjiaer.clinic.server.entity.goods.Goods;
+
+/**
+ *
+ * 商品 Mapper 接口
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-02-21
+ */
+public interface GoodsMapper extends BaseMapper {
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/mapper/goods/GoodsViewMapper.java b/src/main/java/com/syjiaer/clinic/server/mapper/goods/GoodsViewMapper.java
new file mode 100644
index 0000000..2a71c3c
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/mapper/goods/GoodsViewMapper.java
@@ -0,0 +1,18 @@
+package com.syjiaer.clinic.server.mapper.goods;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.syjiaer.clinic.server.entity.goods.GoodsView;
+
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-03-06
+ */
+public interface GoodsViewMapper extends BaseMapper {
+
+}
+
diff --git a/src/main/java/com/syjiaer/clinic/server/mapper/medical/MedicalRecordDetailMapper.java b/src/main/java/com/syjiaer/clinic/server/mapper/medical/MedicalRecordDetailMapper.java
new file mode 100644
index 0000000..b43c6f6
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/mapper/medical/MedicalRecordDetailMapper.java
@@ -0,0 +1,18 @@
+package com.syjiaer.clinic.server.mapper.medical;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.syjiaer.clinic.server.entity.medical.MedicalRecordDetail;
+
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-04-17
+ */
+public interface MedicalRecordDetailMapper extends BaseMapper {
+
+}
+
diff --git a/src/main/java/com/syjiaer/clinic/server/mapper/medical/MedicalRecordMapper.java b/src/main/java/com/syjiaer/clinic/server/mapper/medical/MedicalRecordMapper.java
new file mode 100644
index 0000000..ea56331
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/mapper/medical/MedicalRecordMapper.java
@@ -0,0 +1,18 @@
+package com.syjiaer.clinic.server.mapper.medical;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.syjiaer.clinic.server.entity.medical.MedicalRecord;
+
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-04-17
+ */
+public interface MedicalRecordMapper extends BaseMapper {
+
+}
+
diff --git a/src/main/java/com/syjiaer/clinic/server/mapper/patient/PatientInfoMapper.java b/src/main/java/com/syjiaer/clinic/server/mapper/patient/PatientInfoMapper.java
new file mode 100644
index 0000000..2b06a4c
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/mapper/patient/PatientInfoMapper.java
@@ -0,0 +1,18 @@
+package com.syjiaer.clinic.server.mapper.patient;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.syjiaer.clinic.server.entity.patient.PatientInfo;
+
+
+/**
+ *
+ * 患者信息 Mapper 接口
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-04-17
+ */
+public interface PatientInfoMapper extends BaseMapper {
+
+}
+
diff --git a/src/main/java/com/syjiaer/clinic/server/mapper/patient/RegistrationMapper.java b/src/main/java/com/syjiaer/clinic/server/mapper/patient/RegistrationMapper.java
new file mode 100644
index 0000000..4352ad4
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/mapper/patient/RegistrationMapper.java
@@ -0,0 +1,18 @@
+package com.syjiaer.clinic.server.mapper.patient;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.syjiaer.clinic.server.entity.patient.PatientRegistration;
+
+
+/**
+ *
+ * 挂号表 Mapper 接口
+ *
+ *
+ * @author NiuZiYuan
+ * @since 2025-04-10
+ */
+public interface RegistrationMapper extends BaseMapper {
+
+}
+
diff --git a/src/main/java/com/syjiaer/clinic/server/mapper/social/SocialDirectoryLimitMapper.java b/src/main/java/com/syjiaer/clinic/server/mapper/social/SocialDirectoryLimitMapper.java
index c07c35f..d63ac32 100644
--- a/src/main/java/com/syjiaer/clinic/server/mapper/social/SocialDirectoryLimitMapper.java
+++ b/src/main/java/com/syjiaer/clinic/server/mapper/social/SocialDirectoryLimitMapper.java
@@ -2,6 +2,9 @@ package com.syjiaer.clinic.server.mapper.social;
import com.syjiaer.clinic.server.entity.social.SocialDirectoryLimit;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Map;
/**
@@ -14,5 +17,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface SocialDirectoryLimitMapper extends BaseMapper {
+ Map getByCode(@Param("code") String hilistCode);
}
diff --git a/src/main/java/com/syjiaer/clinic/server/service/BaseService.java b/src/main/java/com/syjiaer/clinic/server/service/BaseService.java
index 0dbe5e2..6bdb302 100644
--- a/src/main/java/com/syjiaer/clinic/server/service/BaseService.java
+++ b/src/main/java/com/syjiaer/clinic/server/service/BaseService.java
@@ -53,31 +53,21 @@ public abstract class BaseService {
}
protected ManagerUser getManagerUser() {
- Map headers = getHeaders();
- String token = headers.get("authorization");
- if (token == null || token.isEmpty()) {
- throw new VerifyException("登陆令牌不存在,请重新登陆");
+ Map map = infoUtil.getMap();
+ if (map == null || map.get("manager_id") == null) {
+ ManagerUser managerUser = new ManagerUser();
+ managerUser.setId(0);
+ managerUser.setName("test");
+ managerUser.setUsername("test");
+ return managerUser;
}
- Jws claimsJws = null;
- try {
- claimsJws = Jwts.parser()
- .verifyWith(Keys.hmacShaKeyFor(jwtSecret.getBytes()))
- .build()
- .parseSignedClaims(token);
- } catch (JwtException e) {
- throw new VerifyException("用户身份验证已失效,请重新登陆");
- } catch (Exception e) {
- throw new VerifyException("未知验证错误,请重新登陆");
- }
-
- if (claimsJws == null) {
- throw new VerifyException("用户身份验证已失效,请重新登陆");
- }
- Claims claims = claimsJws.getPayload();
+ Object managerId = map.get("manager_id");
+ Object name = map.get("manager_name");
+ Object userName = map.get("manager_userName");
ManagerUser managerUser = new ManagerUser();
- managerUser.setId(Integer.parseInt(claims.getSubject()));
- managerUser.setUsername(claims.get("username", String.class));
- managerUser.setName(claims.get("name", String.class));
+ managerUser.setId(Integer.parseInt(managerId.toString()));
+ managerUser.setName(name.toString());
+ managerUser.setUsername(userName.toString());
return managerUser;
}
diff --git a/src/main/java/com/syjiaer/clinic/server/service/goods/GoodsCateService.java b/src/main/java/com/syjiaer/clinic/server/service/goods/GoodsCateService.java
new file mode 100644
index 0000000..27cd8c5
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/service/goods/GoodsCateService.java
@@ -0,0 +1,58 @@
+package com.syjiaer.clinic.server.service.goods;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.syjiaer.clinic.server.common.vo.Result;
+import com.syjiaer.clinic.server.entity.goods.Goods;
+import com.syjiaer.clinic.server.entity.goods.GoodsCate;
+import com.syjiaer.clinic.server.mapper.goods.GoodsCateMapper;
+import com.syjiaer.clinic.server.mapper.goods.GoodsMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+public class GoodsCateService {
+ @Autowired
+ private GoodsCateMapper goodsCateMapper;
+ @Autowired
+ private GoodsMapper goodsMapper;
+ /*
+ * 获取分类列表
+ * 参数 type 分类类型
+ */
+ public List list(int type){
+ QueryWrapper queryWrapper=new QueryWrapper<>();
+ queryWrapper.eq("type",type);
+ queryWrapper.orderByAsc("sort");
+ return goodsCateMapper.selectList(queryWrapper);
+ }
+ /*
+ * 获取所有分类列表
+ */
+ public Map> getAllList(){
+ List list=goodsCateMapper.selectList(new QueryWrapper<>());
+ return list.stream().collect(Collectors.groupingBy(GoodsCate::getType));
+ }
+ /*
+ * 删除分类
+ * 参数 id 分类id
+ */
+ public void del(int id){
+ goodsCateMapper.deleteById(id);
+ UpdateWrapper updateWrapper = new UpdateWrapper<>();
+ updateWrapper.set("cate_id",-1);
+ updateWrapper.eq("cate_id",id);
+ goodsMapper.update(updateWrapper);
+ }
+ /*
+ * 保存/修改分类
+ * 参数 cateList 分类列表
+ */
+ public void save(List cateList){
+ goodsCateMapper.insertOrUpdate(cateList);
+ }
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/service/goods/GoodsService.java b/src/main/java/com/syjiaer/clinic/server/service/goods/GoodsService.java
new file mode 100644
index 0000000..6f42643
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/service/goods/GoodsService.java
@@ -0,0 +1,345 @@
+package com.syjiaer.clinic.server.service.goods;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.syjiaer.clinic.server.common.api.input.IM3501;
+import com.syjiaer.clinic.server.common.api.input.IM3502;
+import com.syjiaer.clinic.server.common.api.request.SocialRequest;
+import com.syjiaer.clinic.server.common.constants.Constants;
+import com.syjiaer.clinic.server.common.enums.GoodsPricingModelEnum;
+import com.syjiaer.clinic.server.common.enums.GoodsTypeEnum;
+import com.syjiaer.clinic.server.common.enums.InventorySocialTypeEnum;
+import com.syjiaer.clinic.server.common.exception.MessageException;
+import com.syjiaer.clinic.server.common.vo.Page;
+import com.syjiaer.clinic.server.entity.goods.Goods;
+import com.syjiaer.clinic.server.entity.goods.dto.GoodsQuery;
+import com.syjiaer.clinic.server.entity.goods.vo.GoodsDetailVo;
+import com.syjiaer.clinic.server.entity.inventory.Inventory;
+import com.syjiaer.clinic.server.entity.social.SocialDirectory;
+import com.syjiaer.clinic.server.entity.social.dto.SocialDirectoryView;
+import com.syjiaer.clinic.server.mapper.goods.GoodsMapper;
+import com.syjiaer.clinic.server.mapper.inventory.InventoryMapper;
+import com.syjiaer.clinic.server.service.social.SocialDirectoryService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Service
+public class GoodsService {
+ @Autowired
+ private GoodsMapper goodsMapper;
+ @Autowired
+ private SocialRequest socialRequest;
+ @Autowired
+ private InventoryMapper inventoryMapper;
+ @Autowired
+ private SocialDirectoryService socialDirectoryService;
+ /*
+ * 新建商品
+ * @param goods 商品信息
+ */
+ public void createGoods(Goods goods) {
+ if (goods.getPricingModel().equals(GoodsPricingModelEnum.Bonus.getPricingModel())) {
+ //进价加成 更新固定售价
+ goods.setUnitPrice(goods.getPurchaseUnitPrice()
+ .multiply(new BigDecimal(goods.getMakeUp() + 100)).divide(new BigDecimal(100), 6, RoundingMode.HALF_DOWN));
+ }
+ if (goods.getTrdnFlag()==null||!goods.getTrdnFlag()){
+ goods.setDisassemblyPrice(null);
+ }
+ if (goods.getInventoryWholeNumber() == null) {
+ goods.setInventoryWholeNumber(0);
+ }
+ if (goods.getInventoryFragmentNumber() == null) {
+ goods.setInventoryFragmentNumber(0);
+ }
+ Double goodsInterestRate = goods.getUnitPrice().subtract(goods.getPurchaseUnitPrice()
+ ).divide(goods.getUnitPrice(), 4, RoundingMode.HALF_DOWN).doubleValue();
+ goods.setInterestRate(goodsInterestRate);
+ //初始化库存
+ if (goods.getId() == null) {
+ //新建档
+ goodsMapper.insert(goods);
+ } else {
+ //修改建档信息
+ Goods dbGoods = goodsMapper.selectById(goods.getId());
+ goodsMapper.updateById(goods);
+ if (!dbGoods.getTrdnFlag().equals(goods.getTrdnFlag())) {
+ // todo 拆零标志变化 重新初始化医保库存
+ requestReturnInit(goods);
+
+ }
+ }
+ }
+ /*
+ * 重新初始化医保库存
+ */
+ public void returnInit(Goods goods) {
+ // todo 重新初始化医保库存
+ requestReturnInit(goods);
+ }
+ /*
+ * 重新初始化医保库存
+ * @param goods 商品信息
+ */
+ public void requestReturnInit(Goods goods) {
+ if (goods.getType().equals(GoodsTypeEnum.otherGoods.getType())) {
+ //其他商品无需上报
+ return;
+ }
+ //获取最近的一条入库记录
+ QueryWrapper inventoryWrapper = new QueryWrapper<>();
+ inventoryWrapper.eq("good_id", goods.getId());
+ inventoryWrapper.orderByDesc("id");
+ List inventories = inventoryMapper.selectList(inventoryWrapper);
+ if (inventories.isEmpty()){
+ return;
+ }
+
+ Inventory latestInventory = inventories.get(0);
+ SocialDirectory socialDirectory = socialDirectoryService.getByCode(goods.getHilistCode());
+ IM3501 im3501 = new IM3501();
+ BigDecimal number = new BigDecimal(goods.getInventoryWholeNumber());
+ BigDecimal price =goods.getUnitPrice();
+ if (goods.getTrdnFlag()) {
+ number = number.multiply(new BigDecimal(goods.getMinPackagingNumber())).add(new BigDecimal(goods.getInventoryFragmentNumber()));
+ price = goods.getDisassemblyPrice();
+ }
+ com.alibaba.fastjson2.JSONObject jsonObject = JSONObject.parseObject(socialDirectory.getData());
+ im3501.setMedListCodg(socialDirectory.getCode())
+ .setMedListCodg(socialDirectory.getCode())
+ .setFixmedinsHilistId(String.valueOf(socialDirectory.getId()))
+ .setFixmedinsHilistName(goods.getName())
+ .setFixmedinsBchno(latestInventory.getInventoryPurchaseCode())
+ .setInvdate(LocalDate.now())
+ .setInvCnt(number)
+ .setManuDate(latestInventory.getProductionDate())
+ .setExpyEnd(latestInventory.getExpiryDate())
+ .setRxFlag((String) jsonObject.get("rx_flag"));
+ socialRequest.call3501(im3501);
+ IM3502 im3502 = new IM3502();
+ im3502.setPric(price)
+ .setMedListCodg(socialDirectory.getCode())
+ .setInvChgType(String.valueOf(InventorySocialTypeEnum.INITIAL_INBOUND.getType()))
+ .setFixmedinsHilistId(String.valueOf(socialDirectory.getId()))
+ .setFixmedinsHilistName(goods.getName())
+ .setFixmedinsBchno(String.valueOf(latestInventory.getInventoryPurchaseCode()))
+ .setRxFlag((String) jsonObject.get("rx_flag"))
+ .setInvChgTime(latestInventory.getCreateDatetime())
+ .setTrdnFlag(goods.getTrdnFlag()?"1":"0")
+ .setCnt(number);
+ socialRequest.call3502(im3502);
+ }
+ /*
+ * 获取商品详情
+ * @param goodsQuery 商品查询条件
+ */
+ public Page searchGoodeDetail(GoodsQuery goodsQuery) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ if (goodsQuery.getPageSize() == null || goodsQuery.getPageSize() == 0) {
+ goodsQuery.setPageSize(Constants.DetailPageSize);
+ }
+ if (goodsQuery.getPageNum() == null || goodsQuery.getPageNum() == 0) {
+ goodsQuery.setPageNum(1);
+ }
+ if (goodsQuery.getName() != null && !goodsQuery.getName().isEmpty()) {
+ queryWrapper.like("name", goodsQuery.getName());
+ }
+ if (goodsQuery.getMinInterestRate() != null) {
+ queryWrapper.ge("interest_rate*100", goodsQuery.getMinInterestRate());
+ }
+ if (goodsQuery.getMaxInterestRate() != null) {
+ queryWrapper.le("interest_rate*100", goodsQuery.getMaxInterestRate());
+ }
+ if (goodsQuery.getCateId() != null) {
+ queryWrapper.eq("cate_id", goodsQuery.getCateId());
+ }
+ if (goodsQuery.isStatus()){
+ //是否只查询可售商品
+ queryWrapper.eq("status", goodsQuery.isStatus());
+ }
+ if (goodsQuery.getInventoryNumber() != null){
+ queryWrapper.and(wrapper ->{
+ wrapper.gt("inventory_whole_number", goodsQuery.getInventoryNumber());
+ wrapper.or().gt("inventory_fragment_number", goodsQuery.getInventoryNumber());
+ });
+ }
+
+ if (goodsQuery.getInterestRateIntervalList() != null && !goodsQuery.getInterestRateIntervalList().isEmpty()) {
+ queryWrapper.and(wrapper -> {
+ for (GoodsQuery.interestRateInterval interestRateInterval : goodsQuery.getInterestRateIntervalList()) {
+ if (interestRateInterval.getMin() != null) {
+ wrapper.gt("interest_rate", interestRateInterval.getMin());
+ }
+ if (interestRateInterval.getMax() != null) {
+ wrapper.le("interest_rate", interestRateInterval.getMax());
+ }
+ wrapper.or();
+ }
+ });
+ }
+ Page page = selectPage(goodsQuery, queryWrapper);
+ List goodsDetailVoList = new ArrayList<>();
+ for (Goods goods:page.getList()){
+ GoodsDetailVo goodsDetailVo = new GoodsDetailVo();
+ BeanUtils.copyProperties(goods, goodsDetailVo);
+ QueryWrapper inventoryQuery = new QueryWrapper<>();
+ inventoryQuery.eq("good_id", goods.getId());
+ inventoryQuery.orderByAsc("expiry_date");
+ List inventoryList = inventoryMapper.selectList(inventoryQuery);
+ if (!inventoryList.isEmpty()){
+ goodsDetailVo.setRecentlyExpiryDate(inventoryList.get(0).getExpiryDate());
+
+ BigDecimal costPrice = inventoryList.stream()
+ .map(inventory -> inventory.getPurchaseUnitPrice()
+ .multiply(new BigDecimal(inventory.getWholeNumber()))
+ .add(inventory.getFragmentPrice()
+ .multiply(new BigDecimal(inventory.getFragmentNumber()))))
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
+ goodsDetailVo.setCostPrice(costPrice);
+ }
+ SocialDirectoryView dbSocialInfo = socialDirectoryService.fullInfo(goods.getHilistCode());
+ if (dbSocialInfo != null){
+ goodsDetailVo.setHilistPricUplmtAmt(dbSocialInfo.getHilistPricUplmtAmt());
+ goodsDetailVo.setHilistLmtpricType(dbSocialInfo.getHilistLmtpricType());
+ goodsDetailVo.setSelfpayProp(dbSocialInfo.getSelfpayProp());
+ goodsDetailVoList.add(goodsDetailVo);
+ }
+
+ }
+ Page result = new Page<>();
+ result.setList(goodsDetailVoList);
+ result.setTotal_count(page.getTotal_count());
+ result.setTotal_page(page.getTotal_page());
+ return result;
+ }
+ /*
+ * 分页查询商品
+ * @param goodsQuery 查询条件
+ * @param queryWrapper 查询条件
+ */
+ private Page selectPage(GoodsQuery goodsQuery, QueryWrapper queryWrapper) {
+ long totalCount = goodsMapper.selectCount(queryWrapper);
+ int totalPage = (int) Math.ceil((double) totalCount / goodsQuery.getPageSize());
+ int offset = (goodsQuery.getPageNum() - 1) * goodsQuery.getPageSize();
+ Integer limit = goodsQuery.getPageSize();
+ queryWrapper.orderByDesc("id");
+ queryWrapper.last("limit " + limit + " offset " + offset);
+ Page page = new Page<>();
+ List list = goodsMapper.selectList(queryWrapper);
+ page.setList(list);
+ page.setTotal_count(totalCount);
+ page.setTotal_page(totalPage);
+ return page;
+ }
+ /*
+ * 根据关键字搜索商品
+ * @param keyword 关键字
+ */
+ public List search(String keyword) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.like("name", keyword);
+ queryWrapper.or();
+ queryWrapper.like("common_name", keyword);
+ queryWrapper.or();
+ queryWrapper.like("barcode", keyword);
+ queryWrapper.or();
+ queryWrapper.like("hilist_code", keyword);
+ queryWrapper.or();
+ queryWrapper.like("producer", keyword);
+ queryWrapper.last("limit 1000");
+ return goodsMapper.selectList(queryWrapper);
+ }
+ /*
+ * 根据id获取商品信息
+ * @param id 商品id
+ */
+ public Goods get(int id) {
+ Goods goods = goodsMapper.selectById(id);
+ if (goods == null) {
+ throw new MessageException("id不存在");
+ }
+ return goods;
+ }
+ /*
+ * 添加标识码
+ * 参数 goodsId 商品ID
+ * 参数 idCode 标识码
+ */
+ public void addIdCode(int goodsId, String idCode){
+ Goods dbGoods = goodsMapper.selectById(goodsId);
+ if (dbGoods == null){
+ throw new MessageException("商品不存在");
+ }
+ List idCodeList = null;
+ if (dbGoods.getIdCode() == null){
+ idCodeList = new ArrayList<>();
+ }else {
+ idCodeList = new ArrayList<>(Arrays.asList(dbGoods.getIdCode().split(",")));
+ }
+ if (idCodeList.contains(idCode)){
+ //重复标识码
+ return;
+ }
+ idCodeList.add(idCode);
+ Goods updateGoods = new Goods();
+ updateGoods.setId(dbGoods.getId());
+ updateGoods.setIdCode(String.join(",",idCodeList));
+ goodsMapper.updateById(updateGoods);
+ }
+ /*
+ * 获取二级分类绑定的商品数量
+ * 参数 cateId 二级分类ID
+ */
+ public Long getByCateId(int cateId) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("cate_id", cateId);
+ return goodsMapper.selectCount(queryWrapper);
+
+ }
+ /*
+ * 更新商品库存信息
+ * 参数 id 商品ID
+ */
+ public void updateInventoryInfoById(Integer id){
+ Goods dbGoods = goodsMapper.selectById(id);
+ if (dbGoods==null){
+ return;
+ }
+ QueryWrapper goodWrapper = new QueryWrapper<>();
+ goodWrapper.eq("good_id", id);
+ goodWrapper.orderByDesc("id");
+ List inventories = inventoryMapper.selectList(goodWrapper);
+ if (inventories==null||inventories.isEmpty()) {
+ return;
+ }
+ Goods updateGoods = new Goods();
+ updateGoods.setId(dbGoods.getId());
+ //更新最近进货价格
+ updateGoods.setPurchaseUnitPrice(inventories.get(0).getPurchaseUnitPrice());
+ if (dbGoods.getPricingModel().equals(GoodsPricingModelEnum.Bonus.getPricingModel())){
+ //更新售价
+ updateGoods.setUnitPrice(updateGoods.getPurchaseUnitPrice()
+ .multiply(new BigDecimal(dbGoods.getMakeUp() + 100))
+ .divide(new BigDecimal(100), 6, RoundingMode.HALF_DOWN));
+ }
+ //更新库存
+ Integer totalWholeNumber = 0;
+ Integer totalFragmentNumber = 0;
+ for (Inventory inventory : inventories){
+ totalWholeNumber += inventory.getWholeNumber();
+ totalFragmentNumber += inventory.getFragmentNumber();
+ }
+ updateGoods.setInventoryWholeNumber(totalWholeNumber);
+ updateGoods.setInventoryFragmentNumber(totalFragmentNumber);
+ goodsMapper.updateById(updateGoods);
+ }
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/service/inventory/InventoryApplyService.java b/src/main/java/com/syjiaer/clinic/server/service/inventory/InventoryApplyService.java
new file mode 100644
index 0000000..76f0ae4
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/service/inventory/InventoryApplyService.java
@@ -0,0 +1,128 @@
+package com.syjiaer.clinic.server.service.inventory;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.syjiaer.clinic.server.common.constants.Constants;
+import com.syjiaer.clinic.server.common.enums.InventorySocialTypeEnum;
+import com.syjiaer.clinic.server.common.enums.InventoryTypeEnum;
+import com.syjiaer.clinic.server.common.enums.Type;
+import com.syjiaer.clinic.server.common.exception.MessageException;
+import com.syjiaer.clinic.server.common.vo.Page;
+import com.syjiaer.clinic.server.common.vo.Result;
+import com.syjiaer.clinic.server.entity.inventory.InventoryApply;
+import com.syjiaer.clinic.server.entity.inventory.InventoryApplyLog;
+import com.syjiaer.clinic.server.entity.inventory.InventoryLog;
+import com.syjiaer.clinic.server.entity.manager.ManagerUser;
+import com.syjiaer.clinic.server.mapper.inventory.InventoryApplyLogMapper;
+import com.syjiaer.clinic.server.mapper.inventory.InventoryApplyMapper;
+import com.syjiaer.clinic.server.mapper.inventory.InventoryLogMapper;
+import com.syjiaer.clinic.server.service.BaseService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class InventoryApplyService extends BaseService {
+ @Autowired
+ private InventoryService inventoryService;
+ private InventoryLogMapper inventoryLogMapper;
+ @Autowired
+ private InventoryApplyMapper inventoryApplyMapper;
+ @Autowired
+ private InventoryApplyLogMapper inventoryApplyLogMapper;
+ @Transactional(rollbackFor = Exception.class)
+ public void create(List