From a8d8a76fd21ab0f616ccde4a3093591f958d3a8f Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Tue, 19 Aug 2025 10:10:07 +0800 Subject: [PATCH] =?UTF-8?q?[add]=20=E7=89=A9=E8=B5=84=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E8=81=94=E7=B3=BB=E5=8D=95=E6=A8=A1=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-local.yml | 289 ++++++++++++++++++ .../template/物资采购联系单模版.docx | Bin 0 -> 19788 bytes .../controller/BusPurchaseDocController.java | 50 +-- .../cailiaoshebei/controller/constant.java | 1 + .../BusMaterialbatchdemandplanWordDto.java | 23 ++ .../domain/dto/BusPurchaseDocWordDto.java | 33 ++ .../service/IBusPurchaseDocService.java | 21 +- .../impl/BusPurchaseDocServiceImpl.java | 117 ++++++- .../dromara/job/attendance/AttendanceJob.java | 2 +- ...gsProgressCategoryTemplateServiceImpl.java | 4 +- 10 files changed, 501 insertions(+), 39 deletions(-) create mode 100644 xinnengyuan/ruoyi-admin/src/main/resources/application-local.yml create mode 100644 xinnengyuan/ruoyi-admin/src/main/resources/template/物资采购联系单模版.docx create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/dto/BusMaterialbatchdemandplanWordDto.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/dto/BusPurchaseDocWordDto.java diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/application-local.yml b/xinnengyuan/ruoyi-admin/src/main/resources/application-local.yml new file mode 100644 index 00000000..10877d39 --- /dev/null +++ b/xinnengyuan/ruoyi-admin/src/main/resources/application-local.yml @@ -0,0 +1,289 @@ +--- # 临时文件存储位置 避免临时文件被系统清理报错 +spring.servlet.multipart.location: /ruoyi/server/temp + +--- # 监控中心配置 +spring.boot.admin.client: + # 增加客户端开关 + enabled: false + url: http://localhost:9090/admin + instance: + service-host-type: IP + metadata: + username: ${spring.boot.admin.client.username} + userpassword: ${spring.boot.admin.client.password} + username: @monitor.username@ + password: @monitor.password@ + +--- # snail-job 配置 +snail-job: + enabled: false + # 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务 + group: "ruoyi_group" + # SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config`表 + token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT" + server: + host: 127.0.0.1 + port: 17888 + # 命名空间UUID 详见 script/sql/ry_job.sql `sj_namespace`表`unique_id`字段 + namespace: ${spring.profiles.active} + # 随主应用端口漂移 + port: 2${server.port} + # 客户端ip指定 + host: + # RPC类型: netty, grpc + rpc-type: grpc + +--- # 数据源配置 +spring: + datasource: + type: com.zaxxer.hikari.HikariDataSource + # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content + dynamic: + # 性能分析插件(有性能损耗 不建议生产环境使用) + p6spy: false + # 设置默认的数据源或者数据源组,默认值即为 master + primary: master + # 严格模式 匹配不到数据源则报错 + strict: true + datasource: + # 主库数据源 + master: + type: ${spring.datasource.type} + driverClassName: com.mysql.cj.jdbc.Driver + # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 + # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) + url: jdbc:mysql://192.168.110.2:13386/xinnengyuanlocal?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: xinnengyuanlocal + password: 5Rff6TrihXZAAT5M + # # 从库数据源 + # slave: + # lazy: true + # type: ${spring.datasource.type} + # driverClassName: com.mysql.cj.jdbc.Driver + # url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + # username: + # password: + # oracle: + # type: ${spring.datasource.type} + # driverClassName: oracle.jdbc.OracleDriver + # url: jdbc:oracle:thin:@//localhost:1521/XE + # username: ROOT + # password: root + # postgres: + # type: ${spring.datasource.type} + # driverClassName: org.postgresql.Driver + # url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true + # username: root + # password: root + # sqlserver: + # type: ${spring.datasource.type} + # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver + # url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true + # username: SA + # password: root + hikari: + # 最大连接池数量 + maxPoolSize: 20 + # 最小空闲线程数量 + minIdle: 10 + # 配置获取连接等待超时的时间 + connectionTimeout: 30000 + # 校验超时时间 + validationTimeout: 5000 + # 空闲连接存活最大时间,默认10分钟 + idleTimeout: 600000 + # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟 + maxLifetime: 1800000 + # 多久检查一次连接的活性 + keepaliveTime: 30000 + +--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉) +spring.data: + redis: + # 地址 + host: 192.168.110.2 + # 端口,默认为6379 + port: 9287 + # 数据库索引 + database: 6 + # redis 密码必须配置 + password: syar23rdsaagdrsa + # 连接超时时间 + timeout: 10s + # 是否开启ssl + ssl.enabled: false + +# redisson 配置 +redisson: + # redis key前缀 + keyPrefix: + # 线程池数量 + threads: 16 + # Netty线程池数量 + nettyThreads: 32 + # 单节点配置 + singleServerConfig: + # 客户端名称 + clientName: ${ruoyi.name} + # 最小空闲连接数 + connectionMinimumIdleSize: 32 + # 连接池大小 + connectionPoolSize: 64 + # 连接空闲超时,单位:毫秒 + idleConnectionTimeout: 10000 + # 命令等待超时,单位:毫秒 + timeout: 3000 + # 发布和订阅连接池大小 + subscriptionConnectionPoolSize: 50 + +--- # mail 邮件发送 +mail: + enabled: false + host: smtp.163.com + port: 465 + # 是否需要用户名密码验证 + auth: true + # 发送方,遵循RFC-822标准 + from: xxx@163.com + # 用户名(注意:如果使用foxmail邮箱,此处user为qq号) + user: xxx@163.com + # 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助) + pass: xxxxxxxxxx + # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。 + starttlsEnable: true + # 使用SSL安全连接 + sslEnable: true + # SMTP超时时长,单位毫秒,缺省值不超时 + timeout: 0 + # Socket连接超时值,单位毫秒,缺省值不超时 + connectionTimeout: 0 + +--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商 +# https://sms4j.com/doc3/ 差异配置文档地址 支持单厂商多配置,可以配置多个同时使用 +sms: + # 配置源类型用于标定配置来源(interface,yaml) + config-type: yaml + # 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制 + restricted: true + # 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效 + minute-max: 1 + # 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效 + account-max: 30 + # 以下配置来自于 org.dromara.sms4j.provider.config.BaseConfig类中 + blends: + # 唯一ID 用于发送短信寻找具体配置 随便定义别用中文即可 + # 可以同时存在两个相同厂商 例如: ali1 ali2 两个不同的阿里短信账号 也可用于区分租户 + config1: + # 框架定义的厂商名称标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 + supplier: alibaba + # 有些称为accessKey有些称之为apiKey,也有称为sdkKey或者appId。 + access-key-id: 您的accessKey + # 称为accessSecret有些称之为apiSecret + access-key-secret: 您的accessKeySecret + signature: 您的短信签名 + sdk-app-id: 您的sdkAppId + config2: + # 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 + supplier: tencent + access-key-id: 您的accessKey + access-key-secret: 您的accessKeySecret + signature: 您的短信签名 + sdk-app-id: 您的sdkAppId + +--- # 三方授权 +justauth: + # 前端外网访问地址 + address: http://localhost:80 + type: + maxkey: + # maxkey 服务器地址 + # 注意 如下均配置均不需要修改 maxkey 已经内置好了数据 + server-url: http://sso.maxkey.top + client-id: 876892492581044224 + client-secret: x1Y5MTMwNzIwMjMxNTM4NDc3Mzche8 + redirect-uri: ${justauth.address}/social-callback?source=maxkey + topiam: + # topiam 服务器地址 + server-url: http://127.0.0.1:1989/api/v1/authorize/y0q************spq***********8ol + client-id: 449c4*********937************759 + client-secret: ac7***********1e0************28d + redirect-uri: ${justauth.address}/social-callback?source=topiam + scopes: [ openid, email, phone, profile ] + qq: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=qq + union-id: false + weibo: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=weibo + gitee: + client-id: 91436b7940090d09c72c7daf85b959cfd5f215d67eea73acbf61b6b590751a98 + client-secret: 02c6fcfd70342980cd8dd2f2c06c1a350645d76c754d7a264c4e125f9ba915ac + redirect-uri: ${justauth.address}/social-callback?source=gitee + dingtalk: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=dingtalk + baidu: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=baidu + csdn: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=csdn + coding: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=coding + coding-group-name: xx + oschina: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=oschina + alipay_wallet: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=alipay_wallet + alipay-public-key: MIIB**************DAQAB + wechat_open: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=wechat_open + wechat_mp: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=wechat_mp + wechat_enterprise: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise + agent-id: 1000002 + gitlab: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=gitlab +# 和风天气 https://dev.qweather.com/ +weather: + key-id: T65EAABUXC + project-id: 2JTHPUQ5YY + private-key: MC4CAQAwBQYDK2VwBCIEIMAglX7IsxYiTeM+FXXnvCUsIggajeP4s8gAllewm6BN + api-host: n35rk53njv.re.qweatherapi.com +# dxf转 geojson 执行文件名 +dxf2GeoJson: + file-name: main +ys7: + app-key: 3acf9f1a43dc4209841e0893003db0a2 + app-secret: 4bbf3e9394f55d3af6e3af27b2d3db36 +# 斯巴达算法 +sparta: + url: http://119.3.204.120:8040 + client-id: test + client-secret: 115fcb08fa6742a1b086d9bb80a6ad59 +# 身份证加密密钥(32 位) +id-card: + encrypt-key: 7ae260d150a14027d2238a1cf80a48ef +recognizer: + url: http://192.168.110.5:50070 diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/template/物资采购联系单模版.docx b/xinnengyuan/ruoyi-admin/src/main/resources/template/物资采购联系单模版.docx new file mode 100644 index 0000000000000000000000000000000000000000..892087aca212a812fb405ddbc6d3db3a42a86652 GIT binary patch literal 19788 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⩔8C|m|*7fn?{&{;`-Cte{gOYo4BC~<_NWw=K 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 literal 0 HcmV?d00001 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/controller/BusPurchaseDocController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/controller/BusPurchaseDocController.java index 3a464ff5..929c0080 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/controller/BusPurchaseDocController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/controller/BusPurchaseDocController.java @@ -1,33 +1,34 @@ package org.dromara.cailiaoshebei.controller; -import java.util.ArrayList; -import java.util.List; - -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import lombok.RequiredArgsConstructor; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; import org.dromara.cailiaoshebei.domain.BusPlanDocAssociation; import org.dromara.cailiaoshebei.domain.bo.BusMaterialbatchdemandplanBo; +import org.dromara.cailiaoshebei.domain.bo.BusPurchaseDocBo; import org.dromara.cailiaoshebei.domain.vo.BusMaterialbatchdemandplanVo; +import org.dromara.cailiaoshebei.domain.vo.BusPurchaseDocVo; import org.dromara.cailiaoshebei.service.IBusMaterialbatchdemandplanService; import org.dromara.cailiaoshebei.service.IBusPlanDocAssociationService; -import org.springframework.web.bind.annotation.*; -import org.springframework.validation.annotation.Validated; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.web.core.BaseController; -import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.cailiaoshebei.service.IBusPurchaseDocService; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.log.enums.BusinessType; import org.dromara.common.excel.utils.ExcelUtil; -import org.dromara.cailiaoshebei.domain.vo.BusPurchaseDocVo; -import org.dromara.cailiaoshebei.domain.bo.BusPurchaseDocBo; -import org.dromara.cailiaoshebei.service.IBusPurchaseDocService; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; /** * 物资-采购联系单 @@ -67,6 +68,17 @@ public class BusPurchaseDocController extends BaseController { ExcelUtil.exportExcel(list, "物资-采购联系单", BusPurchaseDocVo.class, response); } + /** + * 根据主键导出物资-采购联系单 + */ + @SaCheckPermission("cailiaoshebei:purchaseDoc:downloadWord") + @Log(title = "物资-采购联系单", businessType = BusinessType.EXPORT) + @PostMapping("/export/word") + public void exportWordById(@NotNull(message = "主键不能为空") Long id, + HttpServletResponse response) { + busPurchaseDocService.exportWordById(id, response); + } + /** * 获取物资-采购联系单详细信息 * @@ -75,7 +87,7 @@ public class BusPurchaseDocController extends BaseController { @SaCheckPermission("cailiaoshebei:purchaseDoc:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { + @PathVariable Long id) { return R.ok(busPurchaseDocService.queryById(id)); } @@ -120,7 +132,7 @@ public class BusPurchaseDocController extends BaseController { */ @GetMapping("/planList/{id}") public R> list(@NotNull(message = "主键不能为空") - @PathVariable("id") Long id) { + @PathVariable("id") Long id) { List list = planDocAssociationService.list(Wrappers.lambdaQuery(BusPlanDocAssociation.class) .eq(BusPlanDocAssociation::getDocId, id)); List list1 = list.stream().map(BusPlanDocAssociation::getPlanId).toList(); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/controller/constant.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/controller/constant.java index 2c4c0cca..5964bab9 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/controller/constant.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/controller/constant.java @@ -10,4 +10,5 @@ public class constant { public static final String MaterialsPlans = "materialsPlans"; //计划 public static final String BatchRequirements = "batchRequirements"; //需求 public static final String EquipmentOrdering = "equipmentOrdering"; //订货 + public static final String PURCHASE_DOC_TEMPLATE_PATH = "template/物资采购联系单模版.docx"; // 采购联系单文件路径 } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/dto/BusMaterialbatchdemandplanWordDto.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/dto/BusMaterialbatchdemandplanWordDto.java new file mode 100644 index 00000000..af918f11 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/dto/BusMaterialbatchdemandplanWordDto.java @@ -0,0 +1,23 @@ +package org.dromara.cailiaoshebei.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author lilemy + * @date 2025-08-18 16:37 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BusMaterialbatchdemandplanWordDto { + + private Integer num; + private String childName; + private String specification; + private String unit; + private Long demandQuantity; + private String remark; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/dto/BusPurchaseDocWordDto.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/dto/BusPurchaseDocWordDto.java new file mode 100644 index 00000000..e00cdb9e --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/dto/BusPurchaseDocWordDto.java @@ -0,0 +1,33 @@ +package org.dromara.cailiaoshebei.domain.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author lilemy + * @date 2025-08-18 16:31 + */ +@Data +public class BusPurchaseDocWordDto { + + private String projectName; + private String docCode; + private String supplier; + private String reason; + private String name; + private String arrivalDate; + private String designDirectorTel; + private String technicalDirectorTel; + private String receivingAddress; + private String contacts; + private String projectDirector; + private String purchasingAgent; + private String preparedDate; + private String signingUnit; + private String signingPerson; + private String signingDate; + + private List items; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/IBusPurchaseDocService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/IBusPurchaseDocService.java index 6257bc15..1a03bb74 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/IBusPurchaseDocService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/IBusPurchaseDocService.java @@ -1,12 +1,12 @@ package org.dromara.cailiaoshebei.service; -import org.dromara.cailiaoshebei.domain.vo.BusPurchaseDocVo; -import org.dromara.cailiaoshebei.domain.bo.BusPurchaseDocBo; -import org.dromara.cailiaoshebei.domain.BusPurchaseDoc; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.mybatis.core.page.PageQuery; - import com.baomidou.mybatisplus.extension.service.IService; +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.cailiaoshebei.domain.BusPurchaseDoc; +import org.dromara.cailiaoshebei.domain.bo.BusPurchaseDocBo; +import org.dromara.cailiaoshebei.domain.vo.BusPurchaseDocVo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; import java.math.BigDecimal; import java.util.Collection; @@ -19,7 +19,7 @@ import java.util.List; * @author Lion Li * @date 2025-08-13 */ -public interface IBusPurchaseDocService extends IService{ +public interface IBusPurchaseDocService extends IService { /** * 查询物资-采购联系单 @@ -75,4 +75,11 @@ public interface IBusPurchaseDocService extends IService{ * 创建补货采购单 */ void create(Long id, HashMap map); + + /** + * 根据主键导出Word + * + * @param id 主键id + */ + void exportWordById(Long id, HttpServletResponse response); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusPurchaseDocServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusPurchaseDocServiceImpl.java index 9a2ab1fd..3fa9fa6d 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusPurchaseDocServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusPurchaseDocServiceImpl.java @@ -1,17 +1,34 @@ package org.dromara.cailiaoshebei.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.cailiaoshebei.controller.constant; import org.dromara.cailiaoshebei.domain.BusMaterialbatchdemandplan; -import org.dromara.cailiaoshebei.domain.BusMrpBase; import org.dromara.cailiaoshebei.domain.BusPlanDocAssociation; +import org.dromara.cailiaoshebei.domain.BusPurchaseDoc; import org.dromara.cailiaoshebei.domain.bo.BusPlanDocAssociationBo; +import org.dromara.cailiaoshebei.domain.bo.BusPurchaseDocBo; +import org.dromara.cailiaoshebei.domain.dto.BusMaterialbatchdemandplanWordDto; +import org.dromara.cailiaoshebei.domain.dto.BusPurchaseDocWordDto; import org.dromara.cailiaoshebei.domain.vo.BusPlanDocAssociationVo; +import org.dromara.cailiaoshebei.domain.vo.BusPurchaseDocVo; +import org.dromara.cailiaoshebei.mapper.BusPurchaseDocMapper; import org.dromara.cailiaoshebei.service.IBusMaterialbatchdemandplanService; import org.dromara.cailiaoshebei.service.IBusMrpBaseService; import org.dromara.cailiaoshebei.service.IBusPlanDocAssociationService; +import org.dromara.cailiaoshebei.service.IBusPurchaseDocService; import org.dromara.common.core.domain.event.ProcessDeleteEvent; import org.dromara.common.core.domain.event.ProcessEvent; import org.dromara.common.core.domain.event.ProcessTaskEvent; @@ -19,23 +36,21 @@ import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.oss.exception.OssException; +import org.springframework.beans.BeanUtils; import org.springframework.context.event.EventListener; +import org.springframework.http.MediaType; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import org.dromara.cailiaoshebei.domain.bo.BusPurchaseDocBo; -import org.dromara.cailiaoshebei.domain.vo.BusPurchaseDocVo; -import org.dromara.cailiaoshebei.domain.BusPurchaseDoc; -import org.dromara.cailiaoshebei.mapper.BusPurchaseDocMapper; -import org.dromara.cailiaoshebei.service.IBusPurchaseDocService; import org.springframework.transaction.annotation.Transactional; +import java.io.IOException; +import java.io.InputStream; import java.math.BigDecimal; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -245,6 +260,86 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl items = new ArrayList<>(); + List planDocAssociationList = planDocAssociationService.lambdaQuery() + .eq(BusPlanDocAssociation::getDocId, id) + .list(); + if (CollUtil.isNotEmpty(planDocAssociationList)) { + List planIds = planDocAssociationList.stream().map(BusPlanDocAssociation::getPlanId).toList(); + items = materialbatchdemandplanService.listByIds(planIds); + } + BusPurchaseDocWordDto data = this.getReplacementDto(purchaseDoc, items); + // 生成文件 + try (InputStream is = getClass().getClassLoader().getResourceAsStream(constant.PURCHASE_DOC_TEMPLATE_PATH)) { + if (is == null) { + throw new ServiceException("模板文件不存在"); + } + LoopRowTableRenderPolicy hackLoopTableRenderPolicy = new LoopRowTableRenderPolicy(); + Configure config = Configure.builder().bind("items", hackLoopTableRenderPolicy).build(); + XWPFTemplate template = XWPFTemplate.compile(is, config); + template.render(data); + + // 设置响应头,通知浏览器下载 Word 文件 + String fileName = URLEncoder.encode("物料领料单_" + id + ".docx", StandardCharsets.UTF_8); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8"); + response.setHeader("Content-Disposition", "attachment; filename=" + fileName); + try (ServletOutputStream out = response.getOutputStream()) { + template.write(out); // 将文件写入响应流 + out.flush(); + } + template.close(); + } catch (IOException e) { + throw new OssException("生成Word文件失败,错误信息: " + e.getMessage()); + } + } + + /** + * 根据实体获取替换数据 + * + * @param purchaseDoc 物资-采购联系单对象 + * @param items 物资-批次需求计划对象列表 + * @return 替换 Word 数据 + */ + private BusPurchaseDocWordDto getReplacementDto(BusPurchaseDoc purchaseDoc, List items) { + BusPurchaseDocWordDto dto = new BusPurchaseDocWordDto(); + BeanUtils.copyProperties(purchaseDoc, dto); + // 日期转换 + LocalDate arrivalDate = purchaseDoc.getArrivalDate(); + dto.setArrivalDate(arrivalDate.format(DateTimeFormatter.ofPattern("yyyy 年 MM 月 dd 日"))); + LocalDate signingDate = purchaseDoc.getSigningDate(); + dto.setSigningDate(signingDate.format(DateTimeFormatter.ofPattern("yyyy 年 MM 月 dd 日"))); + // 明细项信息 + if (CollUtil.isNotEmpty(items)) { + List dtoItems = new ArrayList<>(); + for (int i = 1; i <= items.size(); i++) { + BusMaterialbatchdemandplan item = items.get(i - 1); + BusMaterialbatchdemandplanWordDto itemDto = new BusMaterialbatchdemandplanWordDto(); + BeanUtils.copyProperties(item, itemDto); + itemDto.setNum(i); + itemDto.setChildName(item.getName()); + dtoItems.add(itemDto); + } + dto.setItems(dtoItems); + } else { + BusMaterialbatchdemandplanWordDto itemDto = new BusMaterialbatchdemandplanWordDto(); + itemDto.setNum(1); + dto.setItems(List.of(itemDto)); + } + return dto; + } + /** * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等) * 正常使用只需#processEvent.flowCode=='leave1' diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/attendance/AttendanceJob.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/attendance/AttendanceJob.java index 3a1b52f7..603099d3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/attendance/AttendanceJob.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/attendance/AttendanceJob.java @@ -31,7 +31,7 @@ import java.time.LocalTime; import java.util.*; @Slf4j -@Component +//@Component public class AttendanceJob { @Resource diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryTemplateServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryTemplateServiceImpl.java index ea34c19e..2fbdc86c 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryTemplateServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryTemplateServiceImpl.java @@ -286,12 +286,14 @@ public class PgsProgressCategoryTemplateServiceImpl extends ServiceImpl