From ab5b66e9b4537070ea1ce761a93cf274c8b99a3f Mon Sep 17 00:00:00 2001 From: YuanFeng <770153798@qq.com> Date: Mon, 2 Dec 2024 23:41:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E5=B8=81=E7=A7=8D?= =?UTF-8?q?=E5=92=8C=E4=BA=A7=E5=93=81=E9=BB=98=E8=AE=A4=E4=BB=B7=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/common/util/JsonUtil.java | 490 ++++++++++++++++++ .../productinfo/dto/PriceListItemDTO.java | 14 + .../productinfo/dto/ProductInfoPageDTO.java | 20 + .../productinfo/vo/ProductInfoPageReqVO.java | 21 + .../productinfo/vo/ProductInfoRespVO.java | 21 + .../productinfo/vo/ProductInfoSaveReqVO.java | 22 + .../front/dto/CreateSaleOrderDTO.java | 12 + .../dataobject/productinfo/ProductInfoDO.java | 21 + .../saleorderentry/SaleOrderEntryDO.java | 5 + .../productinfo/ProductInfoService.java | 13 +- .../productinfo/ProductInfoServiceImpl.java | 21 + .../service/saleorder/SaleOrderService.java | 1 + .../saleorder/SaleOrderServiceImpl.java | 18 +- hangtag-ui/hangtag-ui-admin/src/utils/dict.ts | 4 +- .../src/views/oms/currency/CurrencyForm.vue | 176 +++++++ .../src/views/oms/currency/index.vue | 210 ++++++++ .../views/oms/productinfo/ProductInfoForm.vue | 168 +++++- hangtag-ui/hangtag-ui-front/src/utils/dict.ts | 4 + .../src/views/oms/order/createorder/index.vue | 227 ++++---- sql/mysql/20241202/产品信息新增字段.sql | 14 + 20 files changed, 1363 insertions(+), 119 deletions(-) create mode 100644 hangtag-framework/hangtag-common/src/main/java/cn/hangtag/framework/common/util/JsonUtil.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/dto/PriceListItemDTO.java create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/oms/currency/CurrencyForm.vue create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/oms/currency/index.vue create mode 100644 sql/mysql/20241202/产品信息新增字段.sql diff --git a/hangtag-framework/hangtag-common/src/main/java/cn/hangtag/framework/common/util/JsonUtil.java b/hangtag-framework/hangtag-common/src/main/java/cn/hangtag/framework/common/util/JsonUtil.java new file mode 100644 index 0000000..d479258 --- /dev/null +++ b/hangtag-framework/hangtag-common/src/main/java/cn/hangtag/framework/common/util/JsonUtil.java @@ -0,0 +1,490 @@ +package cn.hangtag.framework.common.util; + + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.TreeNode; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.type.CollectionLikeType; +import com.fasterxml.jackson.databind.type.MapType; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.lang.Nullable; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.text.SimpleDateFormat; +import java.util.*; + +@Slf4j +public class JsonUtil { + + public static String toJson(T value) { + try { + return getFastInstance().writeValueAsString(value); + } catch (Exception var2) { + log.error(var2.getMessage(), var2); + return null; + } + } + + public static String toJson(T value, String defaultValue) { + if (value == null) { + return defaultValue; + } + try { + return getFastInstance().writeValueAsString(value); + } catch (Exception var2) { + return defaultValue; + } + } + + @SneakyThrows + public static byte[] toJsonAsBytes(Object object) { + return getFastInstance().writeValueAsBytes(object); + + } + + public static T parse(String content, Class valueType) { + try { + return getInstance().readValue(content, valueType); + } catch (Exception var3) { + log.error(var3.getMessage(), var3); + return null; + } + } + public static T parseFast(String content, Class valueType) { + try { + return getFastInstance().readValue(content, valueType); + } catch (Exception var3) { + log.error(var3.getMessage(), var3); + return null; + } + } + + @SneakyThrows + public static T parse(String content, TypeReference typeReference) { + + return getInstance().readValue(content, typeReference); + } + + @SneakyThrows + public static T parse(byte[] bytes, Class valueType) { + return getInstance().readValue(bytes, valueType); + } + + @SneakyThrows + public static T parse(byte[] bytes, TypeReference typeReference) { + return getInstance().readValue(bytes, typeReference); + + } + + @SneakyThrows + public static T parse(InputStream in, Class valueType) { + return getInstance().readValue(in, valueType); + + } + + @SneakyThrows + public static T parse(InputStream in, TypeReference typeReference) { + return getInstance().readValue(in, typeReference); + + } + + public static List parseArray(String content, Class valueTypeRef) { + try { + if (!content.toLowerCase().startsWith("[")) { + content = "[" + content + "]"; + } + + List> list = getInstance().readValue(content, new TypeReference>>() { + }); + List result = new ArrayList(); + Iterator var4 = list.iterator(); + + while (var4.hasNext()) { + Map map = (Map) var4.next(); + result.add(toPojo(map, valueTypeRef)); + } + + return result; + } catch (IOException var6) { + log.error(var6.getMessage(), var6); + return null; + } + } + + @SneakyThrows + public static JsonNode readTree(String jsonString) { + Objects.requireNonNull(jsonString, "jsonString is null"); + return getInstance().readTree(jsonString); + + } + + @SneakyThrows + public static JsonNode readTree(InputStream in) { + Objects.requireNonNull(in, "InputStream in is null"); + return getInstance().readTree(in); + } + + @SneakyThrows + public static JsonNode readTree(byte[] content) { + Objects.requireNonNull(content, "byte[] content is null"); + + return getInstance().readTree(content); + + } + + @SneakyThrows + public static JsonNode readTree(JsonParser jsonParser) { + + return getFastInstance().readTree(jsonParser); + + } + + @SneakyThrows + @Nullable + public static T readValue(@Nullable byte[] content, Class valueType) { + if (ObjectUtil.isEmpty(content)) { + return null; + } + return getInstance().readValue(content, valueType); + + } + + @SneakyThrows + @Nullable + public static T readValue(@Nullable String jsonString, Class valueType) { + if (jsonString == null || jsonString.contains(" ")) { + return null; + } + + return getInstance().readValue(jsonString, valueType); + } + + @SneakyThrows + @Nullable + public static T readValue(@Nullable InputStream in, Class valueType) { + if (in == null) { + return null; + } + return getInstance().readValue(in, valueType); + } + + @SneakyThrows + @Nullable + public static T readValue(@Nullable byte[] content, TypeReference typeReference) { + if (ObjectUtil.isEmpty(content)) { + return null; + } + return getInstance().readValue(content, typeReference); + + } + + @SneakyThrows + @Nullable + public static T readValue(@Nullable String jsonString, TypeReference typeReference) { + if (jsonString == null || jsonString.contains(" ")) { + return null; + } + return getInstance().readValue(jsonString, typeReference); + + + } + + @SneakyThrows + @Nullable + public static T readValue(@Nullable InputStream in, TypeReference typeReference) { + if (in == null) { + return null; + } + return getInstance().readValue(in, typeReference); + + + } + + public static MapType getMapType(Class keyClass, Class valueClass) { + return getFastInstance().getTypeFactory().constructMapType(Map.class, keyClass, valueClass); + } + + public static CollectionLikeType getListType(Class elementClass) { + return getFastInstance().getTypeFactory().constructCollectionLikeType(List.class, elementClass); + } + + @SneakyThrows + public static List readList(@Nullable byte[] content, Class elementClass) { + if (ObjectUtil.isEmpty(content)) { + return Collections.emptyList(); + } + return getInstance().readValue(content, getListType(elementClass)); + + + } + + @SneakyThrows + public static List readList(@Nullable InputStream content, Class elementClass) { + if (content == null) { + return Collections.emptyList(); + } + return getInstance().readValue(content, getListType(elementClass)); + + } + + @SneakyThrows + public static List readList(@Nullable String content, Class elementClass) { + if (ObjectUtil.isEmpty(content)) { + return Collections.emptyList(); + } + return getInstance().readValue(content, getListType(elementClass)); + + + } + + @SneakyThrows + public static Map readMap(@Nullable byte[] content, Class keyClass, Class valueClass) { + if (ObjectUtil.isEmpty(content)) { + return Collections.emptyMap(); + } + return getInstance().readValue(content, getMapType(keyClass, valueClass)); + + + } + + @SneakyThrows + public static Map readMap(@Nullable InputStream content, Class keyClass, Class valueClass) { + if (ObjectUtil.isEmpty(content)) { + return Collections.emptyMap(); + } + return getInstance().readValue(content, getMapType(keyClass, valueClass)); + } + + @SneakyThrows + public static Map readMap(@Nullable String content, Class keyClass, Class valueClass) { + if (ObjectUtil.isEmpty(content)) { + return Collections.emptyMap(); + } + return getInstance().readValue(content, getMapType(keyClass, valueClass)); + + } + + public static Map readMap(@Nullable String content) { + return readMap(content, String.class, Object.class); + } + + @SneakyThrows + public static List> readListMap(@Nullable String content) { + if (ObjectUtil.isEmpty(content)) { + return Collections.emptyList(); + } + return getInstance().readValue(content, new TypeReference>>() { + }); + } + + public static T convertValue(Object fromValue, Class toValueType) { + return getFastInstance().convertValue(fromValue, toValueType); + } + + public static T convertValue(Object fromValue, JavaType toValueType) { + return getFastInstance().convertValue(fromValue, toValueType); + } + + public static T convertValue(Object fromValue, TypeReference toValueTypeRef) { + return getFastInstance().convertValue(fromValue, toValueTypeRef); + } + + public static T treeToValue(TreeNode treeNode, Class valueType) { + try { + return getFastInstance().treeToValue(treeNode, valueType); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return null; + } + + public static JsonNode valueToTree(@Nullable Object value) { + return getInstance().valueToTree(value); + } + + public static boolean canSerialize(@Nullable Object value) { + return value == null || getInstance().canSerialize(value.getClass()); + } + + public static Map toMap(String content) { + try { + return (Map) getInstance().readValue(content, Map.class); + } catch (IOException var2) { + log.error(var2.getMessage(), var2); + return null; + } + } + + public static Map toMap(String content, Class valueTypeRef) { + try { + Map> map = getInstance().readValue(content, new TypeReference>>() { + }); + Map result = new HashMap(16); + Iterator var4 = map.entrySet().iterator(); + + while (var4.hasNext()) { + Map.Entry> entry = (Map.Entry) var4.next(); + result.put(entry.getKey(), toPojo(entry.getValue(), valueTypeRef)); + } + + return result; + } catch (IOException var6) { + log.error(var6.getMessage(), var6); + return null; + } + } + + public static T toPojo(Map fromValue, Class toValueType) { + return getFastInstance().convertValue(fromValue, toValueType); + } + + /** + * 使用这个覆盖更多类型配置,效率一点些,但是精度更高 + * + * @param fromValue 从价值 + * @param toValueType 指向值类型 + * @return {@link T } + */ + public static T toPojoFull(Object fromValue, Class toValueType) { + return getInstance().convertValue(fromValue, toValueType); + } + + /** + * 使用这个覆盖更多类型配置,效率一点些,但是精度更高 + * + * @param fromValue + * @param toValueType + * @param + * @return + */ + public static T convertValueFull(Object fromValue, Class toValueType) { + return getInstance().convertValue(fromValue, toValueType); + } + + private static final ObjectMapper INSTANCE = new NormalJacksonObjectMapper(); + private static final ObjectMapper FAST_INSTANCE = new FastObjectMapper(); + + public static ObjectMapper getInstance() { + return INSTANCE; + } + + public static ObjectMapper getFastInstance() { + return FAST_INSTANCE; + } + + /** + * 使用表达式获取值 + * String city = getValue2(jsonString, "person.address.city2", String.class); + * + * @param jsonString JSON字符串 + * @param expression 表达式 + * @param targetType 目标类型 + * @return {@link T} + */ + public static T getJsonValue(String jsonString, String expression, Class targetType) { + JSONObject jsonObject = JSONUtil.parseObj(jsonString); + Object result = jsonObject.getByPath(expression); + return targetType.cast(result); + } + + + /** + * 一般的配置 + * + * @author YuanFeng + * @date 2022/11/21 + */ + private static class NormalJacksonObjectMapper extends ObjectMapper implements Serializable { + public NormalJacksonObjectMapper(ObjectMapper src) { + super(src); + } + + public NormalJacksonObjectMapper() { + //序列化BigDecimal时之间输出原始数字还是科学计数, 默认false, 即是否以toPlainString()科学计数方式来输出 + disable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN); + //允许将JSON空字符串强制转换为null对象值 + enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); + //允许单个数值当做数组处理 + enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); + //禁止重复键, 抛出异常 + enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY); + //禁止使用int代表Enum的order()來反序列化Enum, 抛出异常 + enable(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS); + //有属性不能映射的时候不报错 + disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + //使用null表示集合类型字段是时不抛异常 + disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES); + //对象为空时不抛异常 + disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); + + //允许在JSON中使用c/c++风格注释 + enable(JsonParser.Feature.ALLOW_COMMENTS); + //强制转义非ascii字符 + disable(JsonGenerator.Feature.ESCAPE_NON_ASCII); + //允许未知字段 + enable(JsonGenerator.Feature.IGNORE_UNKNOWN); + //在JSON中允许未引用的字段名 + enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES); + //时间格式 + disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); + //识别单引号 + enable(JsonParser.Feature.ALLOW_SINGLE_QUOTES); + + // 配置 ObjectMapper + setSerializationInclusion(JsonInclude.Include.NON_NULL); // NULL不参与序列化 + // 设置时区为默认系统时区 + setTimeZone(TimeZone.getDefault()); // 默认时区 + } + } + + /** + * 快速对象映射器 不做复杂的序列化配置 + * + * @author YuanFeng + * @date 2022/11/26 + */ + private static class FastObjectMapper extends ObjectMapper implements Serializable { + public FastObjectMapper(ObjectMapper src) { + super(src); + } + + public FastObjectMapper() { + //序列化BigDecimal时之间输出原始数字还是科学计数, 默认false,不以toPlainString()科学计数方式来输出 + disable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN); + //允许将JSON空字符串强制转换为null对象值 + enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); + //允许单个数值当做数组处理 + enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); + //禁止重复键, 抛出异常 + enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY); + //禁止使用int代表Enum的order()來反序列化Enum, 抛出异常 + enable(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS); + //有属性不能映射的时候不报错 + disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + //使用null表示集合类型字段是时不抛异常 + disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES); + //对象为空时不抛异常 + disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); + //允许未知字段 + enable(JsonGenerator.Feature.IGNORE_UNKNOWN); + //在JSON中允许未引用的字段名 + enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES); + + } + } + + +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/dto/PriceListItemDTO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/dto/PriceListItemDTO.java new file mode 100644 index 0000000..06558cd --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/dto/PriceListItemDTO.java @@ -0,0 +1,14 @@ +package cn.hangtag.module.oms.controller.admin.productinfo.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class PriceListItemDTO implements Serializable { + + private String c; // 币别 + private BigDecimal p; // 单价 + private Boolean d; // 是否默认 +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/dto/ProductInfoPageDTO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/dto/ProductInfoPageDTO.java index 6d8c159..42ef859 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/dto/ProductInfoPageDTO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/dto/ProductInfoPageDTO.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import java.io.Serializable; +import java.math.BigDecimal; import java.time.LocalDateTime; @Data @@ -63,6 +64,25 @@ public class ProductInfoPageDTO implements Serializable { */ private String summary; + /** + * 生产说明-富文本内容 + */ + private String productionInfo; + /** + * 默认售价 + */ + private BigDecimal sellingPrice; + /** + * 币种 字典 currency_type value + */ + private String currency; + + /** + * json数组数据 [{p:100.25,c:"RMB",d:true}] + * 1.p:价格 2.c:币种 3.d:是否默认 + */ + private String priceList; + /** * 规格尺寸宽度 */ diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/vo/ProductInfoPageReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/vo/ProductInfoPageReqVO.java index 103f157..ca0a5a3 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/vo/ProductInfoPageReqVO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/vo/ProductInfoPageReqVO.java @@ -2,6 +2,8 @@ package cn.hangtag.module.oms.controller.admin.productinfo.vo; import com.alibaba.excel.annotation.ExcelProperty; import lombok.*; + +import java.math.BigDecimal; import java.util.*; import io.swagger.v3.oas.annotations.media.Schema; import cn.hangtag.framework.common.pojo.PageParam; @@ -49,6 +51,25 @@ public class ProductInfoPageReqVO extends PageParam { @Schema(description = "简述") private String summary; + /** + * 生产说明-富文本内容 + */ + private String productionInfo; + /** + * 默认售价 + */ + private BigDecimal sellingPrice; + /** + * 币种 字典 currency_type value + */ + private String currency; + + /** + * json数组数据 [{p:100.25,c:"RMB",d:true}] + * 1.p:价格 2.c:币种 3.d:是否默认 + */ + private String priceList; + /** * 规格尺寸宽度 */ diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/vo/ProductInfoRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/vo/ProductInfoRespVO.java index a371149..9cf441f 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/vo/ProductInfoRespVO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/vo/ProductInfoRespVO.java @@ -3,6 +3,8 @@ package cn.hangtag.module.oms.controller.admin.productinfo.vo; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; + +import java.math.BigDecimal; import java.util.*; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; @@ -70,6 +72,25 @@ public class ProductInfoRespVO { @ExcelProperty("简述") private String summary; + /** + * 生产说明-富文本内容 + */ + private String productionInfo; + /** + * 默认售价 + */ + private BigDecimal sellingPrice; + /** + * 币种 字典 currency_type value + */ + private String currency; + + /** + * json数组数据 [{p:100.25,c:"RMB",d:true}] + * 1.p:价格 2.c:币种 3.d:是否默认 + */ + private String priceList; + /** * 规格尺寸宽度 */ diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/vo/ProductInfoSaveReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/vo/ProductInfoSaveReqVO.java index 3a0d4dc..0906774 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/vo/ProductInfoSaveReqVO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/vo/ProductInfoSaveReqVO.java @@ -5,6 +5,8 @@ import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; + +import java.math.BigDecimal; import java.util.*; import javax.validation.constraints.*; @@ -49,6 +51,26 @@ public class ProductInfoSaveReqVO { @Schema(description = "简述") private String summary; + /** + * 生产说明-富文本内容 + */ + private String productionInfo; + /** + * 默认售价 + */ + private BigDecimal sellingPrice; + /** + * 币种 字典 currency_type value + */ + private String currency; + + /** + * json数组数据 [{p:100.25,c:"RMB",d:true}] + * 1.p:价格 2.c:币种 3.d:是否默认 + */ + private String priceList; + + /** * 规格尺寸宽度 */ diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/CreateSaleOrderDTO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/CreateSaleOrderDTO.java index e9afd70..e5a9393 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/CreateSaleOrderDTO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/CreateSaleOrderDTO.java @@ -1,9 +1,11 @@ package cn.hangtag.module.oms.controller.admin.saleorder.front.dto; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; +import java.math.BigDecimal; import java.util.List; @Data @@ -102,6 +104,16 @@ public class CreateSaleOrderDTO implements Serializable { private Boolean isBatch; + /** + * 币种 字典 currency_type value + */ + private String currency; + + /** + * 驳回原因 + */ + private String rejectReason; + private List saleOrderEntry; } diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/productinfo/ProductInfoDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/productinfo/ProductInfoDO.java index a09032f..8f4ddf5 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/productinfo/ProductInfoDO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/productinfo/ProductInfoDO.java @@ -2,6 +2,8 @@ package cn.hangtag.module.oms.dal.dataobject.productinfo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; + +import java.math.BigDecimal; import java.util.*; import java.time.LocalDateTime; import java.time.LocalDateTime; @@ -75,6 +77,25 @@ public class ProductInfoDO extends BaseDO { */ private String summary; + /** + * 生产说明-富文本内容 + */ + private String productionInfo; + /** + * 默认售价 + */ + private BigDecimal sellingPrice; + /** + * 币种 字典 currency_type value + */ + private String currency; + + /** + * json数组数据 [{p:100.25,c:"RMB",d:true}] + * 1.p:价格 2.c:币种 3.d:是否默认 + */ + private String priceList; + /** * 规格尺寸宽度 */ diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/saleorderentry/SaleOrderEntryDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/saleorderentry/SaleOrderEntryDO.java index 7825ece..449a974 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/saleorderentry/SaleOrderEntryDO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/saleorderentry/SaleOrderEntryDO.java @@ -47,6 +47,11 @@ public class SaleOrderEntryDO extends BaseDO { * 单价 */ private BigDecimal price; + + /** + * 币种 + */ + private String currency; /** * 折扣率 */ diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoService.java index 010f9ed..0f3eab3 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoService.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoService.java @@ -8,6 +8,8 @@ import cn.hangtag.module.oms.controller.admin.productinfo.vo.*; import cn.hangtag.module.oms.dal.dataobject.productinfo.ProductInfoDO; import cn.hangtag.framework.common.pojo.PageResult; +import java.math.BigDecimal; + /** * 产品资料 Service 接口 * @@ -60,5 +62,14 @@ public interface ProductInfoService { * * @return {@link String } */ - public String getNewCode(); + String getNewCode(); + + /** + * 按产品ID查询价格 + * + * @param productId 材质id + * @param currency 货币 + * @return {@link BigDecimal } + */ + BigDecimal queryPriceByProductId(Long productId, String currency); } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoServiceImpl.java index 29a9efb..21296c1 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoServiceImpl.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoServiceImpl.java @@ -4,10 +4,12 @@ import cn.hangtag.framework.common.exception.ServiceException; import cn.hangtag.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.hangtag.framework.common.util.FuncUtil; +import cn.hangtag.framework.common.util.JsonUtil; import cn.hangtag.framework.mybatis.build.QueryFilterInfo; import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; import cn.hangtag.module.oms.base.dal.dataobject.producttype.ProductTypeDO; import cn.hangtag.module.oms.base.dal.mysql.producttype.ProductTypeMapper; +import cn.hangtag.module.oms.controller.admin.productinfo.dto.PriceListItemDTO; import cn.hangtag.module.oms.controller.admin.productinfo.dto.ProductInfoPageDTO; import cn.hangtag.module.oms.controller.admin.productprocess.vo.ProductProcessSaveReqVO; import cn.hangtag.module.oms.dal.dataobject.brand.BrandDO; @@ -28,6 +30,7 @@ import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.*; import cn.hangtag.module.oms.controller.admin.productinfo.vo.*; import cn.hangtag.module.oms.dal.dataobject.productinfo.ProductInfoDO; @@ -251,4 +254,22 @@ public class ProductInfoServiceImpl implements ProductInfoService { } } } + + @Override + public BigDecimal queryPriceByProductId(Long productId, String currency) { + ProductInfoDO infoDO = productInfoMapper.selectById(productId); + if(FuncUtil.isNotEmpty(infoDO)){ + String priceList = infoDO.getPriceList(); + if(FuncUtil.isNotEmpty(priceList)){ + List dtos = JsonUtil.readList(priceList, PriceListItemDTO.class); + for (PriceListItemDTO dto : dtos) { + if(FuncUtil.equals(dto.getC(), currency)){ + return dto.getP(); + } + } + } + } + return new BigDecimal(0); + + } } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java index afc8095..d07db5e 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java @@ -108,6 +108,7 @@ public interface SaleOrderService { * @return {@link Long } */ Long placeOrder(CreateSaleOrderDTO dto); + Long editOrder(Long id,CreateSaleOrderDTO dto); /** diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java index 8871ccf..0b280d2 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java @@ -672,6 +672,7 @@ public class SaleOrderServiceImpl implements SaleOrderService { List entryList = new ArrayList<>(); List skuList = new ArrayList<>(); + String currency = order.getCurrency(); // 转成订单条目 for (SaleOrderEntryItemDTO itemDTO : saleOrderEntry) { SaleOrderEntryDO entry = SaleOrderEntryDO.builder() @@ -681,7 +682,12 @@ public class SaleOrderServiceImpl implements SaleOrderService { .materialName(itemDTO.getProductName()) .qty(itemDTO.getOrderQty()) .deliveryDate(FuncUtil.timeToLocalDate(itemDTO.getDeliveryDate())).build(); - + if(FuncUtil.isNotEmpty(currency)){ + entry.setCurrency(currency); + BigDecimal price = productInfoService.queryPriceByProductId( entry.getMaterialId(),currency); + // 查询默认单价 + entry.setPrice(price); + } entryList.add(entry); List productSkuList = itemDTO.getProductSkuList(); // sku @@ -702,7 +708,6 @@ public class SaleOrderServiceImpl implements SaleOrderService { skuOrderSkuMapper.insertBatch(skuList); updateCustomerInvoiceData(order); - System.out.println(order); return order.getId(); } @@ -728,7 +733,7 @@ public class SaleOrderServiceImpl implements SaleOrderService { // 删除之前的的订单条目 deleteSaleOrderEntryByParentId(order.getId()); saleOrderSkuService.delSkuByOrderId(order.getId()); - + String currency = order.getCurrency(); // 转成订单条目 for (SaleOrderEntryItemDTO itemDTO : saleOrderEntry) { SaleOrderEntryDO entry = SaleOrderEntryDO.builder() @@ -738,6 +743,13 @@ public class SaleOrderServiceImpl implements SaleOrderService { .materialName(itemDTO.getProductName()) .qty(itemDTO.getOrderQty()) .deliveryDate(FuncUtil.timeToLocalDate(itemDTO.getDeliveryDate())).build(); + if(FuncUtil.isNotEmpty(currency)){ + entry.setCurrency(currency); + BigDecimal price = productInfoService.queryPriceByProductId(entry.getMaterialId(),currency); + // 查询默认单价 + entry.setPrice(price); + } + entryList.add(entry); List productSkuList = itemDTO.getProductSkuList(); // sku diff --git a/hangtag-ui/hangtag-ui-admin/src/utils/dict.ts b/hangtag-ui/hangtag-ui-admin/src/utils/dict.ts index 0486488..75a228e 100644 --- a/hangtag-ui/hangtag-ui-admin/src/utils/dict.ts +++ b/hangtag-ui/hangtag-ui-admin/src/utils/dict.ts @@ -105,7 +105,9 @@ export enum DICT_TYPE { COMMON_STATUS = 'common_status', TERMINAL = 'terminal', // 终端 LANGUAGE_LOCALE = 'language_locale', // 地区语言标识 - PRODUCT_DRAFT_TEMPLATE_TYPE = 'product_draft_template_type', // 地区语言标识 + PRODUCT_DRAFT_TEMPLATE_TYPE = 'product_draft_template_type', // 1有模板 2无模板 3尺码唛 + CURRENCY_TYPE = 'currency_type', // 币种 + BRAND_INDUSTRY_FIELD = 'brand_industry_field', DATE_INTERVAL = 'date_interval', // 数据间隔 // ========== SYSTEM 模块 ========== diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/currency/CurrencyForm.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/currency/CurrencyForm.vue new file mode 100644 index 0000000..8fad6b0 --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/currency/CurrencyForm.vue @@ -0,0 +1,176 @@ + + diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/currency/index.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/currency/index.vue new file mode 100644 index 0000000..7cf62d3 --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/currency/index.vue @@ -0,0 +1,210 @@ + + diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/productinfo/ProductInfoForm.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/productinfo/ProductInfoForm.vue index fb8d2c8..8f44c96 100644 --- a/hangtag-ui/hangtag-ui-admin/src/views/oms/productinfo/ProductInfoForm.vue +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/productinfo/ProductInfoForm.vue @@ -168,7 +168,84 @@ + + + + + + + + + +
+ 添加 + +
+ + + + + + + + + + + + + + + + + + + + + @@ -180,7 +257,7 @@
- +
添加工艺 @@ -242,7 +319,11 @@ - + + + + @@ -286,10 +367,15 @@ const formData = ref({ code: undefined, name: undefined, cover: undefined, + productionInfo: undefined, + summary: undefined, brandId: '', productTypeId: '', draftDesignDataId: undefined, draftDesignList: '', + priceList: '', + currency: undefined, + sellingPrice: undefined, enabled: true, remark: undefined, details: undefined, @@ -303,6 +389,7 @@ const formData = ref({ const that = reactive({ brandId: undefined, draftDesignList: [], + priceList: [], updateProcess: false, processInfoList: [{ key: Math.random().toString(36).substring(2, 6), @@ -320,10 +407,17 @@ const addRow = () => { id: '' }) } +const addPriceRow = () => { + that.priceList.push({ + p: 1, + d: false, + c: 'CNY', // 币种 + }) +} const activeName = ref('base') -const removeRow = (index) => { - if (that.draftDesignList.length > 1) { - that.draftDesignList.splice(index, 1) +const removeRow = (data,index) => { + if (data.length > 1) { + data.splice(index, 1) } else { message.error('至少需要一个') } @@ -352,6 +446,15 @@ const duplicateCheck = (id: string) => { } return count > 1; } +const duplicatePriceCheck = (c: string) => { + let count = 0; + for (let i = 0; i < that.priceList.length; i++) { + if (that.priceList[i].c === c) { + count++; + } + } + return count > 1; +} const duplicateInfoCheck = (name: string) => { let count = 0; for (let i = 0; i < that.processInfoList.length; i++) { @@ -361,6 +464,15 @@ const duplicateInfoCheck = (name: string) => { } return count > 1; } +const changSetDefault = (index,d)=>{ + if(d){ + for(let i=0;i { try { formData.value = await ProductInfoApi.getProductInfo(id) that.draftDesignList = JSON.parse(formData.value.draftDesignList || '[]') + that.priceList = JSON.parse(formData.value.priceList || '[]') if (isCopy) { formData.value.id = null formData.value.code = null @@ -435,15 +548,16 @@ const submitForm = async () => { // 校验关联设计稿 let countInfo = {}; let ids = []; - if(`${formData.value.templateType}` !== '1'){ + const data = formData.value; + if (`${data.templateType}` !== '1') { data.draftDesignList = [] } // 有模板才校验稿件 - if (`${formData.value.templateType}` === '1') { - if(that.draftDesignList.length == 0){ + if (`${data.templateType}` === '1') { + if (that.draftDesignList.length == 0) { // 没有数据时候设置未无模板 - formData.value.templateType = '2' - }else { + data.templateType = '2' + } else { for (let i = 0; i < that.draftDesignList.length; i++) { const id = that.draftDesignList[i].id const l = that.draftDesignList[i].label @@ -464,12 +578,7 @@ const submitForm = async () => { ids.push(id); } } - } - - - - const data = formData.value; if (that.updateProcess) { // 校验工艺流程 let countInfo2 = {}; @@ -495,6 +604,27 @@ const submitForm = async () => { } data.draftDesignList = JSON.stringify(that.draftDesignList) + // 默认单价 + if(that.priceList.length > 0){ + let match = false; + for (let i = 0; i < that.priceList.length; i++) { + if(duplicatePriceCheck(that.priceList[i].c)){ + message.error(`单价设置-第${i + 1} 行币种重复`) + return; + } + if (that.priceList[i].d) { + data.currency = that.priceList[i].c; + data.sellingPrice = that.priceList[i].p; + match = true; + } + } + if (!match) { + that.priceList[0].d = true; + data.currency = that.priceList[0].c; + data.sellingPrice = that.priceList[0].p; + } + } + data.priceList = JSON.stringify(that.priceList) // 作为默认的设计稿 if (ids.length > 0) { data.draftDesignDataId = ids.join(","); @@ -539,10 +669,15 @@ const resetForm = () => { code: undefined, name: undefined, cover: undefined, + productionInfo: undefined, + summary: undefined, brandId: that.brandId || '', productTypeId: '', draftDesignDataId: undefined, draftDesignList: [], + currency: undefined, + sellingPrice: undefined, + priceList: [], enabled: true, remark: undefined, details: undefined, @@ -553,6 +688,7 @@ const resetForm = () => { templateType: '1', } that.draftDesignList = [] + that.priceList = [] that.processInfoList = [{ key: Math.random().toString(36).substring(2, 6), id: null, // id diff --git a/hangtag-ui/hangtag-ui-front/src/utils/dict.ts b/hangtag-ui/hangtag-ui-front/src/utils/dict.ts index d8a0653..6096fdf 100644 --- a/hangtag-ui/hangtag-ui-front/src/utils/dict.ts +++ b/hangtag-ui/hangtag-ui-front/src/utils/dict.ts @@ -106,6 +106,10 @@ export enum DICT_TYPE { TERMINAL = 'terminal', // 终端 LANGUAGE_LOCALE = 'language_locale', // 地区语言标识 BRAND_INDUSTRY_FIELD = 'brand_industry_field', + PRODUCT_DRAFT_TEMPLATE_TYPE = 'product_draft_template_type', // 1有模板 2无模板 3尺码唛 + CURRENCY_TYPE = 'currency_type', // 币种 + + DATE_INTERVAL = 'date_interval', // 数据间隔 // ========== SYSTEM 模块 ========== SYSTEM_USER_SEX = 'system_user_sex', diff --git a/hangtag-ui/hangtag-ui-front/src/views/oms/order/createorder/index.vue b/hangtag-ui/hangtag-ui-front/src/views/oms/order/createorder/index.vue index 25fa9bd..b258c81 100644 --- a/hangtag-ui/hangtag-ui-front/src/views/oms/order/createorder/index.vue +++ b/hangtag-ui/hangtag-ui-front/src/views/oms/order/createorder/index.vue @@ -1,4 +1,5 @@