From bc76a082becae4e5d344ae1b193582be38761d2d Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期三, 05 三月 2025 16:47:07 +0800 Subject: [PATCH] #新增 1. 新增编规则生成功能 2. 新增PO单同步功能 --- rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java | 5 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/ErpApiController.java | 52 ++ rsf-server/src/main/java/com/vincent/rsf/server/common/config/WebMvcConfig.java | 2 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/Order.java | 56 ++ rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderType.java | 24 + rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ErpApiServiceImpl.java | 72 +++ rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java | 13 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java | 4 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java | 21 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/OrderItem.java | 53 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/ScheduleJobs.java | 33 + rsf-server/src/main/java/com/vincent/rsf/server/api/service/ErpApiService.java | 18 rsf-server/src/main/java/com/vincent/rsf/server/system/entity/SerialRule.java | 10 rsf-server/src/main/java/com/vincent/rsf/server/common/security/SecurityConfig.java | 1 rsf-server/src/main/java/com/vincent/rsf/server/system/utils/SerialRuleUtils.java | 140 ++++++ rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderWorkType.java | 29 + rsf-server/src/main/java/com/vincent/rsf/server/common/utils/DateUtils.java | 726 +++++++++++++++++++++++++++++++++ rsf-server/src/main/java/com/vincent/rsf/server/system/enums/SerialRuleReset.java | 27 + rsf-server/src/main/java/com/vincent/rsf/server/system/enums/SerialRuleType.java | 29 + 20 files changed, 1,291 insertions(+), 26 deletions(-) diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/ErpApiController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/ErpApiController.java new file mode 100644 index 0000000..e83aa51 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/ErpApiController.java @@ -0,0 +1,52 @@ +package com.vincent.rsf.server.api.controller; + +import com.vincent.rsf.framework.common.R; +import com.vincent.rsf.server.api.controller.params.Order; +import com.vincent.rsf.server.api.service.ErpApiService; +import com.vincent.rsf.server.system.controller.BaseController; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author Ryan + * @version 1.0 + * @title ErpApiController + * @description + * @create 2025/3/4 13:19 + */ +@RestController +@RequestMapping("/erp") +@Api(tags = "ERP鎺ュ彛瀵规帴") +public class ErpApiController extends BaseController { + + @Autowired + private ErpApiService erpApiService; + + /** + * @author Ryan + * @description 鎺ユ敹ERP鎺ㄩ�佺殑PO鍗曟嵁 + * @throws + * @return + * @time 2025/3/4 13:57 + */ + @ApiOperation(value = "鎺ユ敹鍚屾ERP閲囪喘鍗�") + @PostMapping("/sync/purchase") + public R syncPurchases(@RequestBody List<Order> orders) { + if (orders.isEmpty()) { + return R.error("鎺ㄩ�佽鍗曚笉鑳戒负绌猴紝璇锋鏌ユ牎楠屽悗鍐嶆搷浣滐紒锛�"); + } + if (!erpApiService.syncPurchasee(orders)) { + return R.error("淇濆瓨澶辫触"); + } else { + return R.ok("淇濆瓨鎴愬姛锛侊紒"); + } + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/Order.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/Order.java new file mode 100644 index 0000000..996b6ea --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/Order.java @@ -0,0 +1,56 @@ +package com.vincent.rsf.server.api.controller.params; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author Ryan + * @version 1.0 + * @title PurchaseOrder + * @description + * @create 2025/3/4 13:41 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "PurchaseOrder", description = "鍏ュ簱鍗曟嵁") +public class Order implements Serializable { + + @ApiModelProperty(value = "鍗曟嵁缂栫爜") + private String code; + + @ApiModelProperty(value = "闇�姹傛暟閲�", required = true) + private Double anfme; + + @ApiModelProperty(value = "宸叉敹璐ф暟閲�",required = true) + private Double qty; + + @ApiModelProperty(value = "鏀惰揣涓暟閲�", required = true) + private Double workQty; + + @ApiModelProperty(value = "璁″垝鏀惰揣鏃堕棿") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @ApiModelProperty(value = "璁″垝鏀惰揣缁撴潫鏃堕棿") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @ApiModelProperty(value = "椤圭洰缂栫爜") + private String projectCode; + + @ApiModelProperty(value = "涓氬姟绫诲瀷") + private String wkType; + + @ApiModelProperty(value = "鍗曟嵁鏄庣粏") + private List<OrderItem> children; +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/OrderItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/OrderItem.java new file mode 100644 index 0000000..0006660 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/OrderItem.java @@ -0,0 +1,53 @@ +package com.vincent.rsf.server.api.controller.params; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * @author Ryan + * @version 1.0 + * @title OrderItem + * @description + * @create 2025/3/5 16:23 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "OrderItem", description = "鍏ュ簱鍗曟嵁") +public class OrderItem implements Serializable { + + @ApiModelProperty(value = "鏄庣粏鏁伴噺") + private Double anfme; + + @ApiModelProperty(value = "宸插畬鎴愭暟閲�") + private Double qty; + + @ApiModelProperty(value = "erp涓婚敭") + private String erpId; + + @ApiModelProperty(value = "鐗╂枡缂栫爜") + private String matnrCode; + + @ApiModelProperty(value = "鐗╂枡鍚嶇О") + private String matnrName; + + @ApiModelProperty(value = "鍗曚綅") + private String unit; + + @ApiModelProperty(value = "鏍囧寘鏁伴噺") + private String nromQty; + + @ApiModelProperty(value = "渚涘簲鍟嗗悕绉�") + private String splrName; + + @ApiModelProperty(value = "渚涘簲鍟嗙紪鐮�") + private String splrCode; + + @ApiModelProperty(value = "渚涘簲鍟嗘壒娆�") + private String splrBatch; + + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderType.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderType.java new file mode 100644 index 0000000..bad8293 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderType.java @@ -0,0 +1,24 @@ +package com.vincent.rsf.server.api.entity.enums; + +/** + * @author Ryan + * @version 1.0 + * @title PurchaseType + * @description + * @create 2025/3/5 15:54 + */ +public enum OrderType { + //璁㈠崟绫诲瀷 + ORDER_PURCHASE_IN("purchase", "閲囪喘鍏ュ簱鍗�"), + ORDER_OUT("out", "閲囪喘鍑哄簱鍗�"), + ; + + OrderType(String type, String desc) { + this.type = type; + this.desc = desc; + } + + public String type; + public String desc; + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderWorkType.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderWorkType.java new file mode 100644 index 0000000..09c00e4 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderWorkType.java @@ -0,0 +1,29 @@ +package com.vincent.rsf.server.api.entity.enums; + +/** + * @author Ryan + * @version 1.0 + * @title PurchaseType + * @description + * @create 2025/3/5 15:54 + */ +public enum OrderWorkType { + //璁㈠崟绫诲瀷 + ORDER_PURCHASE_IN("purchase", "閲囪喘鍗�"), + ORDER_PROD_IN("prod", "鐢熶骇棰嗘枡鍗�"), + ORDER_DONE_IN("done", "瀹屽伐鍏ユ枡鍗�"), + ORDER_SALE_IN("sale", "閿�鍞鍗�"), + ORDER_PROD_BACK_IN("prod back", "鐢熶骇閫�鏂欏崟"), + ORDER_SPLR_BACK_OUT("supplier back", "渚涘簲鍟嗗嚭璐у崟"), + ORDER_SALE_BACK_IN("sale back", "閿�鍞��璐у崟") + ; + + OrderWorkType(String type, String desc) { + this.type = type; + this.desc = desc; + } + + public String type; + public String desc; + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ErpApiService.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ErpApiService.java new file mode 100644 index 0000000..a241420 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ErpApiService.java @@ -0,0 +1,18 @@ +package com.vincent.rsf.server.api.service; + + +import com.vincent.rsf.server.api.controller.params.Order; + +import java.util.List; + +/** + * @author Ryan + * @version 1.0 + * @title ErpApiService + * @description + * @create 2025/3/4 16:23 + */ +public interface ErpApiService { + + boolean syncPurchasee(List<Order> orders); +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ErpApiServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ErpApiServiceImpl.java new file mode 100644 index 0000000..b60f6e1 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ErpApiServiceImpl.java @@ -0,0 +1,72 @@ +package com.vincent.rsf.server.api.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.vincent.rsf.framework.exception.CoolException; +import com.vincent.rsf.server.api.controller.params.OrderItem; +import com.vincent.rsf.server.api.entity.enums.OrderType; +import com.vincent.rsf.server.manager.entity.PurchaseItem; +import com.vincent.rsf.server.manager.service.PurchaseItemService; +import com.vincent.rsf.server.manager.service.PurchaseService; +import com.vincent.rsf.server.system.constant.SerialRuleCode; +import com.vincent.rsf.server.api.controller.params.Order; +import com.vincent.rsf.server.system.utils.SerialRuleUtils; +import com.vincent.rsf.server.api.service.ErpApiService; +import com.vincent.rsf.server.manager.entity.Purchase; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Ryan + * @version 1.0 + * @title ErpApiServiceImpl + * @description + * @create 2025/3/4 16:27 + */ +@Service +public class ErpApiServiceImpl extends ServiceImpl implements ErpApiService { + + @Autowired + private PurchaseService purchaseService; + + @Autowired + private PurchaseItemService purchaseItemService; + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean syncPurchasee(List<Order> orders) { + if (orders.isEmpty()) { + throw new CoolException("鍗曟嵁鍐呭涓嶈兘涓虹┖锛侊紒"); + } + orders.forEach(ors -> { + Purchase purchase = new Purchase(); + BeanUtils.copyProperties(ors, purchase); + String wkVal = SerialRuleUtils.generateRuleCode(SerialRuleCode.PURCHASE_CODE, purchase); + purchase.setCode(wkVal) + .setType(OrderType.ORDER_PURCHASE_IN.type); + if (!purchaseService.save(purchase)) { + throw new CoolException("閲囪喘鍗曟嵁淇濆瓨澶辫触"); + } + //鍒ゆ柇瀛愬垪琛ㄤ笉涓虹┖ + if (!ors.getChildren().isEmpty()) { + ArrayList<PurchaseItem> list = new ArrayList<>(); + ors.getChildren().forEach(orderItem -> { + PurchaseItem item = new PurchaseItem(); + BeanUtils.copyProperties(orderItem, item); + item.setPurchaseId(purchase.getId()); + list.add(item); + }); + if (!purchaseItemService.saveBatch(list)) { + throw new CoolException("閲囪喘鍗曟槑缁嗕繚瀛樺け璐ワ紒锛�"); + } + } + }); + + return true; + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/config/WebMvcConfig.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/config/WebMvcConfig.java index c79c7d6..ddb8d66 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/common/config/WebMvcConfig.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/config/WebMvcConfig.java @@ -26,7 +26,7 @@ public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(getAsyncHandlerInterceptor()) .addPathPatterns("/**") - .excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**","/v3/**","/doc.html/**", "/swagger-ui.html/**"); + .excludePathPatterns("/swagger-resources/**", "/webjars/**","/erp/**", "/v2/**","/v3/**","/doc.html/**", "/swagger-ui.html/**"); } @Bean diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/security/SecurityConfig.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/security/SecurityConfig.java index 53ad888..9375e31 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/common/security/SecurityConfig.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/security/SecurityConfig.java @@ -39,6 +39,7 @@ "/system/info", "/tenant/list", "/email/code", + "/erp/**", "/login", "/register", "/druid/**", diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/DateUtils.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/DateUtils.java new file mode 100755 index 0000000..ff3c883 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/DateUtils.java @@ -0,0 +1,726 @@ +package com.vincent.rsf.server.common.utils; + +import org.apache.tika.utils.StringUtils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.util.*; + +/** + * 鏃ユ湡鏃堕棿宸ュ叿绫� + * + * @author Ryan + * @createTime 2018-07-19 10:42:00 + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils { + + public final static String YYYYMMDDHHMMSS_PATTER = "yyyyMMddHHmmss"; + + public final static String YYYYMMDDHHMMSS_PATTER_HB = "YYYY-MM-dd HH:mm:ss.SSS"; + public final static String YYYYMMDDHHMMSS_PATTER_HB1 = "YYYY-MM-dd HH:mm:ss.000"; + + public static String datetimeFormat = "yyyy-MM-dd HH:mm:ss"; + + public final static String[] parsePatterns = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM/dd", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM.dd", "yyyy.MM", "YYYY-MM-dd HH:mm:ss.SSS"}; + + public static Date now() { + return Calendar.getInstance().getTime(); + } + + /** + * 浠呮樉绀哄勾鏈堟棩锛屼緥濡� 2021-08-11. + */ + public static final String DATE_PATTERN = "yyyy-MM-dd"; + + + /** + * 涓�澶╃殑缁撴潫鏃堕棿锛屼粎鏄剧ず鏃跺垎绉� + */ + private static final String END_TIME = "23:59:59"; + + /** + * @Description锛� 杩斿洖 yyyy-MM-dd HH:mm:ss + */ + public static String nowDate() { + return getDate(new Date()); + } + + /** + * 灏嗘棩鏈熷瓧绗︿覆杞崲涓烘棩鏈熺被鍨� + * + * @param pattern 鏃ユ湡瀛楃涓叉牸寮� 涓嶄紶鍒欎负 yyyy-MM-dd + * @return + * @throws ParseException + */ + public static Date nowDate(String pattern) throws ParseException { + if (StringUtils.isBlank(pattern)) { + pattern = "yyyy-MM-dd"; + } + //璁剧疆鏃ユ湡鏍煎紡 + SimpleDateFormat df = new SimpleDateFormat(pattern); + return df.parse(df.format(new Date())); + } + + /** + * 鑾峰彇鎸囧畾鏃ユ湡褰撳懆鏄熸湡涓�鐨勬椂闂� + * + * @param date + * @return + */ + public static Date getFirstDayOfWeek(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + //鑾峰彇鏈懆绗竴澶� + calendar.set(Calendar.WEEK_OF_YEAR, calendar.get(Calendar.WEEK_OF_YEAR)); + int dayOfWeek = 0; + if (calendar.get(Calendar.DAY_OF_WEEK) == 1) { + dayOfWeek = -6; + } else { + dayOfWeek = 2 - calendar.get(Calendar.DAY_OF_WEEK); + } + calendar.add(Calendar.DAY_OF_WEEK, dayOfWeek); + + return calendar.getTime(); + } + + public static Date getFirstDayOfWeekT(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + //鑾峰彇鏈懆绗竴澶� + calendar.set(Calendar.WEEK_OF_YEAR, calendar.get(Calendar.WEEK_OF_YEAR)); + int dayOfWeek = 0; + if (calendar.get(Calendar.DAY_OF_WEEK) == 1) { + dayOfWeek = -6; + } else { + dayOfWeek = 2 - calendar.get(Calendar.DAY_OF_WEEK); + } + calendar.add(Calendar.DAY_OF_WEEK, dayOfWeek); + + //璁剧疆鏃ユ湡鏍煎紡 + SimpleDateFormat df = new SimpleDateFormat(DATE_PATTERN); + + try { + return df.parse(df.format(calendar.getTime())); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 鑾峰彇鎸囧畾鏃ユ湡褰撳懆鏄熸湡鏃ョ殑鏃堕棿 + * + * @param date + * @return + */ + public static Date getLastDayOfWeek(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setFirstDayOfWeek(Calendar.MONDAY); + calendar.setTime(date); + // Sunday + calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek() + 6); + + return calendar.getTime(); + } + + /** + * 鑾峰彇鎸囧畾鏃ユ湡褰撴湀绗竴澶╃殑鏃堕棿 + * + * @param date + * @return + */ + public static Date getFirstDayOfMonth(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.MONTH, 0); + calendar.set(Calendar.DAY_OF_MONTH, 1); + return calendar.getTime(); + } + + /** + * 鑾峰彇鎸囧畾鏃ユ湡褰撴湀鏈�鍚庝竴澶╃殑鏃堕棿 + * + * @param date + * @return + */ + public static Date getLastDayOfMonth(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.MONTH, 0); + calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); + return calendar.getTime(); + } + + /** + * 鑾峰彇鎸囧畾鏃ユ湡褰撳勾绗竴澶╃殑鏃堕棿 + * + * @param date + * @return + */ + public static Date getFirstDayOfYear(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.clear(); + calendar.set(Calendar.YEAR, date.getYear() + 1900); + return calendar.getTime(); + } + + /** + * 鑾峰彇鎸囧畾鏃ユ湡褰撳勾鏈�鍚庝竴澶╃殑鏃堕棿 + * + * @param date + * @return + */ + public static Date getLastDayOfYear(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.clear(); + calendar.set(Calendar.YEAR, date.getYear() + 1900); + calendar.roll(Calendar.DAY_OF_YEAR, -1); + return calendar.getTime(); + } + + /** + * 鑾峰彇涓や釜鏃ユ湡鐩搁殧鐨勫ぉ鏁� + * + * @param startDate + * @param endDate + * @return + */ + public static float getDateDiffOfDays(Date startDate, Date endDate) { + long diff = endDate.getTime() - startDate.getTime(); + + return diff / (24 * 60 * 60 * 1000); + } + + /** + * 鑾峰彇姣忓ぉ宸ヤ綔灏忔椂鏁般�備緥濡傦細鏃╀笂9鐐逛笂鐝紝涓嬪崍6鐐逛笅鐝紝浼戞伅涓�涓皬鏃讹紝宸ヤ綔鏃堕棿涓�8 + * + * @param startTime 寮�濮嬫椂闂达紝鏍煎紡锛欻Hmm銆備緥濡傛棭涓�7鐐瑰崐锛屼娇鐢�0730琛ㄧず + * @param endTime 缁撴潫鏃堕棿锛屾牸寮忥細HHmm銆備緥濡備笅鍗�6鐐瑰崐锛屼娇鐢�1830琛ㄧず + * @param restHours 浼戞伅鏃堕棿 + * @return + */ + public static float getWorkHours(String startTime, String endTime, float restHours) { + Date m = new Date(); + m.setHours(Integer.parseInt(startTime.substring(0, 2)) - 1); + m.setMinutes(Integer.parseInt(startTime.substring(2))); + Date a = new Date(); + a.setHours(Integer.parseInt(endTime.substring(0, 2)) - 1); + a.setMinutes(Integer.parseInt(endTime.substring(2))); + + return (a.getTime() - m.getTime()) / (1000 * 60 * 60 * 1.0f) - restHours; + } + + /** + * 灏嗘棩鏈熷瓧绗︿覆杞崲涓烘棩鏈熺被鍨� + * + * @param dateStr 鏃ユ湡瀛楃涓� + * @param pattern 鏃ユ湡瀛楃涓叉牸寮� + * @return + * @throws ParseException + */ + public static Date parse(String dateStr, String pattern) throws ParseException { + if (StringUtils.isBlank(dateStr)) { + return null; + } + SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); + return dateFormat.parse(dateStr); + } + + /** + * 鏃ユ湡鍨嬪瓧绗︿覆杞寲涓烘棩鏈� 鏍煎紡 + * { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", + * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", + * "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm" } + */ + public static Date parse(String str) { + if (str == null) { + return null; + } + try { + return parseDate(str, parsePatterns); + } catch (ParseException e) { + return null; + } + } + + public static String formatToAnotherPattern(String dateStr, String pattern, String anotherPatter) throws ParseException { + SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); + + Date date = dateFormat.parse(dateStr); + dateFormat = new SimpleDateFormat(anotherPatter); + return dateFormat.format(date); + } + + /** + * 鑾峰彇鏃ユ湡鏃堕棿瀛楃涓� + * + * @param date 闇�瑕佽浆鍖栫殑鏃ユ湡鏃堕棿 + * @return String 鏃ユ湡鏃堕棿瀛楃涓诧紝渚嬪 2015-08-11 + */ + public static String format(Date date) { + return format(date, DATE_PATTERN); + } + + public static String format(Date date, String pattern) { + if (date == null) { + return ""; + } + SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); + return dateFormat.format(date); + } + + public static Date addHours(Date date, int amount) { + return add(date, Calendar.HOUR_OF_DAY, amount); + } + + public static Date addDays(Date date, int amount) { + return add(date, Calendar.DAY_OF_MONTH, amount); + } + + public static Date addYear(Date date, int amount) { + return add(date, Calendar.YEAR, amount); + } + + public static Date addMonth(Date date, int amount) { + return add(date, Calendar.MONTH, amount); + } + + + private static Date add(Date date, int calendarField, int amount) { + Calendar c = Calendar.getInstance(); + c.setTime(date); + c.add(calendarField, amount); + return c.getTime(); + } + + /** + * 灏嗘绉掓牸寮忓寲锛屽鏋滃ぇ浜�60绉掞紝杩斿洖 1鍒唜x绉掞紝澶т簬60鍒嗛挓锛岃繑鍥� 1灏忔椂xx鍒唜x绉� + * + * @param ms 姣 + * @return + */ + public static String formatTime(long ms) { + if (ms < 1000) { //姣 + return ms + "姣"; + } else if (ms / 1000 < 60) { + // 灏忎簬60绉掞紝浠ョ鏄剧ず + return ms / 1000 + "绉�"; + } else if (ms / 1000 / 60 < 60) { + // 灏忎簬60鍒嗭紝浠ュ垎鏄剧ず + return ms / 1000 / 60 + "鍒�" + (ms / 1000 % 60) + "绉�"; + } else if (ms / 1000 / 60 / 60 < 24) { + // 灏忎簬24灏忔椂 + return (ms / 1000 / 60 / 60) + "鏃�" + (ms / 1000 % 60) + "鍒�" + (ms / 1000 / 60 % 60) + "绉�"; + } else { + return (ms / 1000 / 60 / 60 / 24) + "澶�" + (ms / 1000 / 60 / 60) + "鏃�" + (ms / 1000 % 60) + "鍒�" + (ms / 1000 / 60 % 60) + "绉�"; + } + } + + public static Date dateToISODate(Date date) { + //T浠h〃鍚庨潰璺熺潃鏃堕棿锛孼浠h〃UTC缁熶竴鏃堕棿 + SimpleDateFormat format = + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "GMT"))); + String isoDate = format.format(date); + try { + return format.parse(isoDate); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + + public static Date localDateTime2Date(LocalDateTime localDateTime) { + ZoneId zoneId = ZoneId.systemDefault(); + //Combines this date-time with a time-zone to create a ZonedDateTime. + ZonedDateTime zdt = localDateTime.atZone(zoneId); + //Tue Mar 27 14:17:17 CST 2018 + return Date.from(zdt.toInstant()); + } + + public static String localDateTimeToString(LocalDateTime localDateTime) { + DateTimeFormatter fmt = DateTimeFormatter.ofPattern(datetimeFormat); + return fmt.format(localDateTime); + } + + public static LocalDateTime stringToLocalDateTime(String str) { + DateTimeFormatter fmt = DateTimeFormatter.ofPattern(datetimeFormat); + return LocalDateTime.parse(str, fmt); + } + + public static LocalDateTime stringToLocalDateTime(String str, String fmtStr) { + DateTimeFormatter fmt = DateTimeFormatter.ofPattern(fmtStr); + return LocalDateTime.parse(str, fmt); + } + + /** + * Date杞琇ocalDateTime + * + * @param date Date + * @return LocalDateTime + */ + public static LocalDateTime dateToLocalDateTime(Date date) { + try { + Instant instant = date.toInstant(); + ZoneId zoneId = ZoneId.systemDefault(); + return instant.atZone(zoneId).toLocalDateTime(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * @Description锛氳幏鍙栧綋鍓嶆棩鏈� yyyy-MM-dd HH:mm:ss + * @Author wyt + * @Date 2020/8/21 + */ + public static String getDate(Date date) { + SimpleDateFormat sdf = new SimpleDateFormat(datetimeFormat); + return sdf.format(date); + } + + public static String getDate(Date date, String format) { + SimpleDateFormat sdf = new SimpleDateFormat(format); + return sdf.format(date); + } + + /** + * @Description锛� 鍒ゆ柇鏄惁鏄悎娉曟棩鏈熸牸寮� + * @Author wyt + * @Date 2021/2/24 + */ + public static boolean isValidDate(String str, String fmt) { + if (StringUtils.isBlank(str)) { + return false; + } + boolean convertSuccess = true; + // 鎸囧畾鏃ユ湡鏍煎紡涓哄洓浣嶅勾/涓や綅鏈堜唤/涓や綅鏃ユ湡锛屾敞鎰弝yyy/MM/dd鍖哄垎澶у皬鍐欙紱 + SimpleDateFormat format = new SimpleDateFormat(fmt); + try { + // 璁剧疆lenient涓篺alse. 鍚﹀垯SimpleDateFormat浼氭瘮杈冨鏉惧湴楠岃瘉鏃ユ湡锛屾瘮濡�2007/02/29浼氳鎺ュ彈锛屽苟杞崲鎴�2007/03/01 + format.setLenient(false); + Date date = format.parse(str); + long time = date.getTime(); + if (time < 14400) { + convertSuccess = false; + } + } catch (ParseException e) { + // e.printStackTrace(); + // 濡傛灉throw java.text.ParseException鎴栬�匩ullPointerException锛屽氨璇存槑鏍煎紡涓嶅 + convertSuccess = false; + } + return convertSuccess; + } + + + /** + * 璁$畻涓や釜鏃ユ湡鐩稿樊鐨勭鏁� + * + * @param startDate + * @param endDate + * @return + */ + public static int calLastedTime(Date startDate, Date endDate) { + long a = endDate.getTime(); + long b = startDate.getTime(); + int c = (int) ((a - b) / 1000); + return c; + } + + /** + * 鑾峰彇鏈湀鐨勭涓�澶� + * + * @return Calendar 鏃ュ巻 + */ + public static Calendar getStartDayOfMonth(Date date) { + Calendar calendar = Calendar.getInstance(Locale.CHINA); + calendar.setTime(date); + calendar.set(Calendar.DAY_OF_MONTH, 1); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + return calendar; + } + + /** + * 鏍规嵁鏃ュ巻杩斿洖鏃ユ湡鏃堕棿瀛楃涓� + * + * @param calendar 鏃ュ巻 + * @return String 鏃ユ湡鏃堕棿瀛楃涓� + */ + public static String getDateTimeStr(Calendar calendar) { + StringBuffer buf = new StringBuffer(""); + + buf.append(calendar.get(Calendar.YEAR)); + buf.append("-"); + buf.append(calendar.get(Calendar.MONTH) + 1 > 9 ? calendar.get(Calendar.MONTH) + 1 + "" + : "0" + (calendar.get(Calendar.MONTH) + 1)); + buf.append("-"); + buf.append(calendar.get(Calendar.DAY_OF_MONTH) > 9 ? calendar.get(Calendar.DAY_OF_MONTH) + "" + : "0" + calendar.get(Calendar.DAY_OF_MONTH)); + buf.append(" "); + buf.append(calendar.get(Calendar.HOUR_OF_DAY) > 9 ? calendar.get(Calendar.HOUR_OF_DAY) + "" + : "0" + calendar.get(Calendar.HOUR_OF_DAY)); + buf.append(":"); + buf.append(calendar.get(Calendar.MINUTE) > 9 ? calendar.get(Calendar.MINUTE) + "" + : "0" + calendar.get(Calendar.MINUTE)); + buf.append(":"); + buf.append(calendar.get(Calendar.SECOND) > 9 ? calendar.get(Calendar.SECOND) + "" + : "0" + calendar.get(Calendar.SECOND)); + return buf.toString(); + } + + + /** + * 鑾峰彇鎸囧畾鏃ユ湡褰撴湀绗竴澶╃殑鏃ユ湡瀛楃涓� + * + * @param date 鎸囧畾鏃ユ湡 + * @return String 鏍煎紡锛歽yyy-MM-dd HH:mm:ss + */ + public static String getMonthStartTimeStr(Date date) { + return getDateTimeStr(getStartDayOfMonth(date)); + } + + + /** + * 鑾峰緱鎸囧畾鏃ユ湡鎵�鍦ㄦ棩鐨勭粨鏉熸椂闂村瓧绗︿覆 + * + * @param date 鎸囧畾鏃ユ湡 + * @return String 渚嬪锛�2021-08-11 23:59:59 + */ + public static String getDateEndTimeStr(Date date) { + String result = format(date, DATE_PATTERN); + return result.concat(" ").concat(END_TIME); + } + + + /** + * 鏃堕棿鎴宠浆鏃ユ湡 + * + * @param msStr 鏃堕棿鎴� + * @return 涓嶄负绌猴細yyyy-MM-dd HH:mm:ss鏍煎紡鏃ユ湡锛屼负绌猴細杩斿洖null + */ + public static String transForDate(String msStr) { + if (StringUtils.isBlank(msStr)) { + return null; + } + + long msl = Long.parseLong(msStr); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf.format(msl); + } + + /** + * 鍒ゆ柇鏄惁鏄椂闂存埑 + * + * @param msStr 鏃堕棿鎴� + * @return 涓嶄负绌猴紝骞朵笖鏄椂闂存埑鏍煎紡锛岃繑鍥瀟rue + */ + public static boolean isTimeStamp(String msStr) { + if (StringUtils.isBlank(msStr)) { + return false; + } + boolean is = false; + try { + if (transForDate(msStr) != null) { + is = true; + } + } catch (Exception e) { + e.printStackTrace(); + } + + return is; + } + + /** + * 濡傛灉endDate>startDate锛岃繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse + * + * @param startDate 寮�濮嬫棩鏈熷瓧绗︿覆 + * @param endDate 缁撴潫鏃ユ湡瀛楃涓� + * @return boolean + */ + public static boolean compareDate(Date startDate, Date endDate) { + String startDateStr = format(startDate, DATE_PATTERN); + String endDateStr = format(endDate, DATE_PATTERN); + return compareDate(startDateStr, endDateStr); + } + + /** + * @param thisDate 鈥� 褰撳墠鏃ユ湡 + * @param otherDate 鈥� 姣旇緝鏃ユ湡 + * @Description锛氭妸鏃堕棿鏍煎紡鍖栧埌绉掔骇缁х画姣旇緝 yyyy-MM-dd HH:mm:ss + * 濡傛灉thisDate>otherDate锛岃繑鍥� 1锛� + * thisDate=otherDate锛� 杩斿洖 0锛� + * thisDate<otherDate锛� 杩斿洖 -1锛� + * @Returns int + **/ + public static int compareDateBySecond(Date thisDate, Date otherDate) { + String thisDateStr = format(thisDate, datetimeFormat); + String otherDateStr = format(otherDate, datetimeFormat); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datetimeFormat); + try { + Date tDate = simpleDateFormat.parse(thisDateStr); + Date oDate = simpleDateFormat.parse(otherDateStr); + return tDate.compareTo(oDate); + } catch (Exception e) { + e.printStackTrace(); + } + return thisDate.compareTo(otherDate); + } + + public static boolean compareDate(String startDateStr, String endDateStr) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_PATTERN); + try { + Date startDate = simpleDateFormat.parse(startDateStr); + Date endDate = simpleDateFormat.parse(endDateStr); + return endDate.after(startDate); + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + /** + * 鎸囧畾鏃堕棿寰�鍓嶆垨寰�鍚庡嚑澶� + * + * @param day 澶╂暟 + * @return + */ + public static String getTimeBeforeDay(int day, String fmt) { + if (StringUtils.isBlank(fmt)) { + fmt = "yyyy-MM-dd HH:mm:ss"; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date nowDate = new Date(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(nowDate); + calendar.add(Calendar.DATE, day); + Date updateDate = calendar.getTime(); + return sdf.format(updateDate); + } + + /** + * 鑾峰彇鏃ユ湡鎵�鍦ㄦ湀绗竴澶╅浂鐐� + * + * @return + */ + public static Date getFirstDayZeroOfMonth(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.MONTH, 0); + calendar.set(Calendar.DAY_OF_MONTH, 1); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + return calendar.getTime(); + } + + /** + * 鑾峰彇鏃ユ湡闆剁偣 + * + * @return + */ + public static Date getDayZero(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + return calendar.getTime(); + } + + /** + * 鑾峰彇鎸囧畾鏃ユ湡褰撳懆鏄熸湡涓�鐨勬椂闂� + * + * @param date + * @return + */ + public static Date getFirstDayZeroOfWeek(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + //鑾峰彇鏈懆绗竴澶� + calendar.set(Calendar.WEEK_OF_YEAR, calendar.get(Calendar.WEEK_OF_YEAR)); + int dayOfWeek = 0; + if (calendar.get(Calendar.DAY_OF_WEEK) == 1) { + dayOfWeek = -6; + } else { + dayOfWeek = 2 - calendar.get(Calendar.DAY_OF_WEEK); + } + calendar.add(Calendar.DAY_OF_WEEK, dayOfWeek); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + return calendar.getTime(); + } + + /** + * @author Ryan + * @param: [date] + * @return: java.time.LocalDate + * @date: 2023/7/28 + * @description: 鑾峰彇褰撳墠鏃堕棿鐨勫墠涓�骞� + */ + public static Date getCurrDateOfLastYear(Date date, String perciod, boolean isMinus, Integer num) { + + Instant instant = date.toInstant(); + ZoneId zoneId = ZoneId.systemDefault(); + LocalDateTime of = LocalDateTime.ofInstant(instant, zoneId); + LocalDate localDate = of.toLocalDate(); + ZonedDateTime zonedDateTime = null; + if (perciod.equals("year")) { + if (isMinus) { + zonedDateTime = localDate.minusYears(num).atStartOfDay(zoneId); + } else { + zonedDateTime = localDate.plusYears(num).atStartOfDay(zoneId); + } + } else if (perciod.equals("months")) { + if (isMinus) { + zonedDateTime = localDate.minusMonths(num).atStartOfDay(zoneId); + } else { + zonedDateTime = localDate.plusMonths(num).atStartOfDay(zoneId); + } + } else if (perciod.equals("week")) { + if (isMinus) { + zonedDateTime = localDate.minusWeeks(num).atStartOfDay(zoneId); + } else { + zonedDateTime = localDate.plusWeeks(num).atStartOfDay(zoneId); + } + } else { + if (isMinus) { + zonedDateTime = localDate.minusDays(num).atStartOfDay(zoneId); + } else { + zonedDateTime = localDate.plusDays(num).atStartOfDay(zoneId); + } + } + return Date.from(zonedDateTime.toInstant()); + } + + + public static Date getCurrDateOfLastYear(Date date, Integer num) { + return getCurrDateOfLastYear(date, "year", true, num); + } + + //缁欐棩鏈熷鍔犳寚瀹氬勾 + public static Date addYears(Date date, Integer num) { + // 鍒涘缓Calendar瀵硅薄 + Calendar calendar = Calendar.getInstance(); + + // 璁剧疆寰呮搷浣滅殑鏃ユ湡 + calendar.setTime(date); + + // 澧炲姞涓夊勾 + calendar.add(Calendar.YEAR, num); + + // 鑾峰彇澧炲姞鍚庣殑鏃ユ湡 + Date newDate = calendar.getTime(); + + return newDate; + } +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java index 03d44a6..e088b8a 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java @@ -107,4 +107,6 @@ ExcelUtil.build(ExcelUtil.create(asnOrderService.list(), AsnOrder.class), response); } + + } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java index 6dd9f72..3b4fc39 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java @@ -1,9 +1,5 @@ package com.vincent.rsf.server.manager.controller; -import cn.afterturn.easypoi.excel.ExcelImportUtil; -import cn.afterturn.easypoi.excel.entity.ImportParams; -import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; -import cn.afterturn.easypoi.excel.imports.ExcelImportService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.vincent.rsf.framework.common.Cools; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java index 2f55f31..b59e788 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Purchase.java @@ -2,6 +2,8 @@ import java.text.SimpleDateFormat; import java.util.Date; + +import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -28,6 +30,7 @@ import java.util.Date; @Data +@Accessors(chain = true) @TableName("man_purchase") public class Purchase implements Serializable { @@ -80,7 +83,7 @@ /** * 宸叉敹璐ф暟閲� */ - @ApiModelProperty(value= "宸叉敹璐ф暟閲�") + @ApiModelProperty(value= "鏀惰揣涓暟閲�") private Double workQty; /** diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java index 5d54e83..a9c82a5 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.annotation.TableLogic; import java.text.SimpleDateFormat; import java.util.Date; + +import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -22,6 +24,7 @@ import java.util.Date; @Data +@Accessors(chain = true) @TableName("man_purchase_item") public class PurchaseItem implements Serializable { @@ -80,7 +83,7 @@ * 鏍囧噯鍖呰 */ @ApiModelProperty(value= "鏍囧噯鍖呰") - private Double nomQty; + private Double nromQty; /** * ASN鍗曟嵁鏁伴噺 @@ -98,19 +101,19 @@ * 渚涘簲鍟嗗悕绉� */ @ApiModelProperty(value= "渚涘簲鍟嗗悕绉�") - private String pulrName; + private String splrName; /** * 渚涘簲鍟嗙紪鐮� */ @ApiModelProperty(value= "渚涘簲鍟嗙紪鐮�") - private String pulrCode; + private String splrCode; /** * 渚涘簲鍟嗘壒娆� */ @ApiModelProperty(value= "渚涘簲鍟嗘壒娆�") - private String pulrBatch; + private String splrBatch; /** * 鐘舵�� 1: 姝e父 0: 鍐荤粨 @@ -165,7 +168,7 @@ public PurchaseItem() {} - public PurchaseItem(Long purchaseId,String erpId,String matnrCode,String matnrName,String unit,Double anfme,Double qty,Double nomQty,Double asnQty,Double printQty,String pulrName,String pulrCode,String pulrBatch,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { + public PurchaseItem(Long purchaseId,String erpId,String matnrCode,String matnrName,String unit,Double anfme,Double qty,Double nromQty,Double asnQty,Double printQty,String splrName,String splrCode,String splrBatch,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { this.purchaseId = purchaseId; this.erpId = erpId; this.matnrCode = matnrCode; @@ -173,12 +176,12 @@ this.unit = unit; this.anfme = anfme; this.qty = qty; - this.nomQty = nomQty; + this.nromQty = nromQty; this.asnQty = asnQty; this.printQty = printQty; - this.pulrName = pulrName; - this.pulrCode = pulrCode; - this.pulrBatch = pulrBatch; + this.splrName = splrName; + this.splrCode = splrCode; + this.splrBatch = splrBatch; this.status = status; this.deleted = deleted; this.tenantId = tenantId; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/ScheduleJobs.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/ScheduleJobs.java index dedd1a5..aceb1c9 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/ScheduleJobs.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/ScheduleJobs.java @@ -2,16 +2,18 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.exception.CoolException; +import com.vincent.rsf.server.common.utils.DateUtils; import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.service.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; +import java.util.Date; import java.util.List; +import java.util.Objects; /** * @author Ryan @@ -20,6 +22,7 @@ * @description * @create 2025/3/3 15:38 */ +@Component public class ScheduleJobs { @Autowired @@ -37,26 +40,31 @@ private AsnOrderItemService asnOrderItemService; /** * @author Ryan - * @description 鏍规嵁PO鍗曟嵁鐢熸垚ASN鍗� + * @description 鏍规嵁PO鍗曟嵁鐢熸垚ASN鍗�,鑷姩鐢熸垚ASN鍗曚负鍏ㄩ噺鐢熸垚 * @throws * @return * @time 2025/3/3 15:44 */ - @Scheduled(cron = "0/10 * * * * ? ") + @Scheduled(cron = "0 0/30 * * * ? ") @Transactional(rollbackFor = Exception.class) public void genAsnOrder() { //鑾峰彇鏈敓鎴怉SN鍗曟嵁 - List<Purchase> purchases = purchaseService.list(new LambdaQueryWrapper<Purchase>().eq(Purchase::getStatus, 2)); + List<Purchase> purchases = purchaseService.list(new LambdaQueryWrapper<Purchase>().eq(Purchase::getStatus, 0)); //閲囪喘鍗曚负绌猴紝鐩存帴璺冲嚭褰撳墠浠诲姟 if (purchases.isEmpty()) { return; } //鐢熸垚ASN鍗曟嵁 purchases.forEach(purchase -> { + if (!Objects.isNull(purchase.getStartTime())) { + //鍒ゆ柇璧峰鏃堕棿鏄惁澶т簬褰撳墠鏃堕棿 + if (DateUtils.compareDate(new Date(), purchase.getStartTime())) { + return; + } + } List<PurchaseItem> items = purchaseItemService.list(new LambdaQueryWrapper<PurchaseItem>().eq(PurchaseItem::getPurchaseId, purchase.getId())); - //瀛愬垪琛ㄤ负绌烘暟鎹紝鐩存帴璺冲嚭 if (items.isEmpty()) { - return; + throw new CoolException("瀛愬垪琛ㄦ暟鎹负绌猴紝璇锋煡璇O鍗曟槸鍚︽纭綍鍏ワ紒锛�"); } AsnOrder order = new AsnOrder(); order.setAnfme(purchase.getAnfme()) @@ -74,8 +82,8 @@ orderItem.setAnfme(item.getAnfme()) .setAsnId(purchase.getId()) .setQty(item.getQty()) - .setSplrName(item.getPulrName()) - .setSplrCode(item.getPulrCode()) + .setSplrName(item.getSplrName()) + .setSplrCode(item.getSplrCode()) .setMatnk(item.getMatnrName()) .setPoDetlId(item.getId() + "") .setPurQty(item.getAnfme()) @@ -88,6 +96,13 @@ throw new CoolException(("Asn鍗曟嵁鏄庣粏淇濆瓨澶辫触锛侊紒")); } + //浠诲姟鎵ц瀹屾垚锛屼慨鏀瑰凡瀹屾垚鏁伴噺鍜孭O鍗曟墽琛岀姸鎬� + purchase.setQty(purchase.getAnfme()).setStatus(1); + + if (!purchaseService.save(purchase)) { + throw new CoolException("PO鍗曟墽琛屽畬鎴愬悗锛屼繚瀛樺け璐ワ紒锛�"); + } + }); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java new file mode 100644 index 0000000..bc92ad9 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java @@ -0,0 +1,13 @@ +package com.vincent.rsf.server.system.constant; + +/** + * @author Ryan + * @version 1.0 + * @title SerialRuleCode + * @description + * @create 2025/3/4 17:02 + */ +public class SerialRuleCode { + + public final static String PURCHASE_CODE = "sys_purchase_code"; +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/SerialRule.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/SerialRule.java index 7f2920c..12f7d3f 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/SerialRule.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/SerialRule.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.annotation.TableLogic; import java.text.SimpleDateFormat; import java.util.Date; + +import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -22,6 +24,7 @@ import java.util.Date; @Data +@Accessors(chain = true) @TableName("sys_serial_rule") public class SerialRule implements Serializable { @@ -68,7 +71,7 @@ * 褰撳墠鍊� */ @ApiModelProperty(value= "褰撳墠鍊�") - private String currValue; + private Integer currValue; /** * 鏈�杩戠敓鎴愮紪鐮� @@ -81,6 +84,9 @@ */ @ApiModelProperty(value= "鐘舵�� 1: 姝e父 0: 鍐荤粨 ") private Integer status; + + @ApiModelProperty(value = "娴佹按鍙锋渶澶ч暱搴�") + private Integer maxLen; /** * 鏄惁鍒犻櫎 1: 鏄� 0: 鍚� @@ -129,7 +135,7 @@ public SerialRule() {} - public SerialRule(String code,String name,String delimit,String reset,String resetDep,String currValue,String lastCode,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { + public SerialRule(String code,String name,String delimit,String reset,String resetDep,Integer currValue,String lastCode,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { this.code = code; this.name = name; this.delimit = delimit; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/enums/SerialRuleReset.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/enums/SerialRuleReset.java new file mode 100644 index 0000000..4e93aa4 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/enums/SerialRuleReset.java @@ -0,0 +1,27 @@ +package com.vincent.rsf.server.system.enums; + +/** + * @author Ryan + * @version 1.0 + * @title SerialRuleRest + * @description + * @create 2025/3/5 09:44 + */ +public enum SerialRuleReset { + + //閲嶇疆绫诲瀷锛氬勾 + SERIAL_REST_TYPE_YEAR("year", "骞�"), + //閲嶇疆绫诲瀷锛氭湀 + SERIAL_REST_TYPE_MONTH("month", "鏈�"), + //閲嶇疆绫诲瀷锛氭棩 + SERIAL_REST_TYPE_DAYS("day", "鏃�") + ; + + public String type; + public String desc; + + SerialRuleReset(String type, String desc) { + this.type = type; + this.desc = desc; + } +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/enums/SerialRuleType.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/enums/SerialRuleType.java new file mode 100644 index 0000000..1c3ee92 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/enums/SerialRuleType.java @@ -0,0 +1,29 @@ +package com.vincent.rsf.server.system.enums; + +/** + * @author Ryan + * @version 1.0 + * @title SerialRuleType + * @description + * @create 2025/3/5 08:11 + */ +public enum SerialRuleType { + //甯搁噺鍊� + WK_CONSTANT("1", "甯搁噺"), + //娴佹按鍙� + WK_SERIAL_NO("2", "娴佹按鍙�"), + //鏃ユ湡 + WK_DATE_FORMAT("3", "鏃ユ湡"), + //瀛楁 + WK_FEILD("4", "瀛楁") + ; + + public String wkType; + public String wkName; + + SerialRuleType(String type, String name){ + this.wkType = type; + this.wkName = name; + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/utils/SerialRuleUtils.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/utils/SerialRuleUtils.java new file mode 100644 index 0000000..c026c72 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/utils/SerialRuleUtils.java @@ -0,0 +1,140 @@ +package com.vincent.rsf.server.system.utils; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.vincent.rsf.framework.common.SpringUtils; +import com.vincent.rsf.framework.exception.CoolException; +import com.vincent.rsf.server.common.utils.DateUtils; +import com.vincent.rsf.server.system.entity.SerialRule; +import com.vincent.rsf.server.system.entity.SerialRuleItem; +import com.vincent.rsf.server.system.enums.SerialRuleReset; +import com.vincent.rsf.server.system.enums.SerialRuleType; +import com.vincent.rsf.server.system.service.SerialRuleItemService; +import com.vincent.rsf.server.system.service.SerialRuleService; +import org.apache.tika.utils.StringUtils; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * @author Ryan + * @version 1.0 + * @title 鐢熸垚瑙勫垯缂栫爜鍔熻兘 + * @description + * @create 2025/3/5 08:01 + */ +public class SerialRuleUtils { + + /** + * @author Ryan + * @description 鏍规嵁缂栫爜瑙勫垯鐢熸垚缂栫爜鍙� + * @throws + * @return 缂栫爜鍙� + * @time 2025/3/5 08:52 + */ + public static String generateRuleCode(String code, Object obj) { + SerialRuleService ruleService = SpringUtils.getBean(SerialRuleService.class); + //鑾峰彇瑙勫垯缂栫爜涓诲崟 + SerialRule serialRule = ruleService + .getOne(new LambdaQueryWrapper<SerialRule>() + .eq(SerialRule::getCode, code)); + if (Objects.isNull(serialRule)) { + throw new CoolException("閲囪喘缂栫爜瑙勫垯涓嶅瓨鍦紒锛�"); + } + SerialRuleItemService serialRuleItemService = SpringUtils.getBean(SerialRuleItemService.class); + + //鑾峰彇瑙勫垯缂栫爜鏄庣粏 + List<SerialRuleItem> ruleItems = serialRuleItemService + .list(new LambdaQueryWrapper<SerialRuleItem>() + .eq(SerialRuleItem::getRuleId, serialRule.getId()) + .orderByAsc(SerialRuleItem::getSort)); + if (Objects.isNull(ruleItems)) { + throw new CoolException("缂栫爜瑙勫垯鏄庣粏涓虹┖锛侊紒"); + } + + StringBuffer buffer = new StringBuffer(); + ruleItems.forEach(rule -> { + if (rule.getWkType().equals(SerialRuleType.WK_CONSTANT.wkType)) { + buffer.append(rule.getFeildValue()); + } else if (rule.getWkType().equals(SerialRuleType.WK_SERIAL_NO.wkType)) { + String result = "", format = ""; + if (serialRule.getReset().equals(SerialRuleReset.SERIAL_REST_TYPE_YEAR.type)) { + format = DateUtils.format(new Date(), "yyyy"); + } else if (serialRule.getReset().equals(SerialRuleReset.SERIAL_REST_TYPE_MONTH.type)) { + format = DateUtils.format(new Date(), "MM"); + } else { + format = DateUtils.format(new Date(), "dd"); + } + //褰撳墠鍊艰嚜鍔ㄥ姞1 + Integer curVal = serialRule.getCurrValue() + 1; + //瀛楃涓插乏杈硅嚜鍔犺ˉ0 + String lef = StringUtils.leftPad(curVal + "", serialRule.getMaxLen(), "0"); + //鏈�杩戜竴娆℃祦姘村彿 + result = format + lef; + //淇敼鏈�鍚庣紪鐮侊紝褰撳墠鍊� + serialRule.setCurrValue(curVal); + + buffer.append(result); + } else if (rule.getWkType().equals(SerialRuleType.WK_DATE_FORMAT.wkType)) { + //鑾峰彇鏃堕棿14浣嶆牸寮忔椂闂村�紋yyyMMddHHmmss + String format = DateUtils.format(new Date(), DateUtils.YYYYMMDDHHMMSS_PATTER); + //鍒ゆ柇鏄惁璁剧疆鎴彇闀垮害鍜岃捣濮嬫埅鍙栦綅缃� + buffer.append(subStr(format, rule.getLenStr(), rule.getLen())); + } else if (rule.getWkType().equals(SerialRuleType.WK_FEILD.wkType)) { + String subStr = subStr(objectToMap(obj).get(rule.getFeildValue()).toString(), rule.getLenStr(), rule.getLen()); + buffer.append(subStr); + } + }); + + serialRule.setLastCode(buffer.toString()); + //淇敼褰撳墠瑙勫垯缂栫爜鍙疯嚦鏁版嵁搴� + if (!ruleService.saveOrUpdate(serialRule)) { + throw new CoolException("瑙勫垯缂栫爜淇濆瓨澶辫触锛侊紒"); + } + return buffer.toString(); + } + + /** + * @author Ryan + * @description 鏍规嵁瀛楁闀垮害鍙婏紝璧峰浣嶇疆鎴彇瀛楃涓� + * @throws + * @return + * @time 2025/3/5 13:00 + */ + public static String subStr(String str, Integer start, Integer end) { + StringBuffer buffer = new StringBuffer(); + //鍒ゆ柇鏄惁璁剧疆鎴彇闀垮害鍜岃捣濮嬫埅鍙栦綅缃� + if (Objects.isNull(start) || end == 0) { + buffer.append(str); + } else { + if (str.length() <= (end + start)) { + throw new CoolException("鎴彇瀛楃璧峰嚭瀛楃涓查暱搴︼紝璇锋煡鐪嬭鍒欒瀹氾紒锛�"); + } + //杩斿洖璧峰浣嶇疆lenStr寮�濮嬶紝缁堢偣浣嶇疆涓簂enStr + len闀垮害鐨勫瓧绗︿覆 + String substring = str.substring(start, (start + end)); + buffer.append(substring); + } + return buffer.toString(); + } + + + /** + * @author Ryan + * @description Object 杞� Map瀛楁 + * @throws + * @return + * @time 2025/3/5 14:00 + */ + public static Map<?, ?> objectToMap (Object obj) { + if (obj == null) { + return null; + } + ObjectMapper objectMapper = new ObjectMapper(); + Map<?, ?> mappedObject = objectMapper.convertValue(obj, Map.class); + + return mappedObject; + } + +} -- Gitblit v1.9.1