From 0a4e5fc3bdfca328feb574f1564011abf2a35b76 Mon Sep 17 00:00:00 2001
From: 移动系统liao <liaoxujun@qq.com>
Date: 星期三, 04 六月 2025 11:37:58 +0800
Subject: [PATCH] no message
---
Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs | 101 ++++
Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs | 147 ++++++
Web/src/views/fb_p_complaints/procurementComplaint/component/editDialog.vue | 136 +++++
Admin.NET/Admin.NET.Core/Utils/BaseImportInput.cs | 19
Web/src/api/fb_p_complaints/procurementComplaint.ts | 60 ++
Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs | 334 ++++++++++++++
Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs | 212 +++++++++
Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintDto.cs | 89 +++
Web/src/views/fb_p_complaints/procurementComplaint/index.vue | 224 +++++++++
9 files changed, 1,321 insertions(+), 1 deletions(-)
diff --git a/Admin.NET/Admin.NET.Core/Utils/BaseImportInput.cs b/Admin.NET/Admin.NET.Core/Utils/BaseImportInput.cs
index dbd6ad0..2342e6e 100644
--- a/Admin.NET/Admin.NET.Core/Utils/BaseImportInput.cs
+++ b/Admin.NET/Admin.NET.Core/Utils/BaseImportInput.cs
@@ -24,4 +24,21 @@
[ImporterHeader(IsIgnore = true)]
[ExporterHeader("閿欒淇℃伅", ColumnIndex = 9999, IsBold = true, IsAutoFit = true)]
public virtual string Error { get; set; }
-}
\ No newline at end of file
+}
+public class BaseImportInputGuid
+{
+ /// <summary>
+ /// 璁板綍Id
+ /// </summary>
+ [ImporterHeader(IsIgnore = true)]
+ [ExporterHeader(IsIgnore = true)]
+ public virtual Guid Id { get; set; }
+
+ /// <summary>
+ /// 閿欒淇℃伅
+ /// </summary>
+ [ImporterHeader(IsIgnore = true)]
+ [ExporterHeader("閿欒淇℃伅", ColumnIndex = 9999, IsBold = true, IsAutoFit = true)]
+ public virtual string Error { get; set; }
+}
+
diff --git a/Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs b/Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs
new file mode 100644
index 0000000..3d4d86e
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs
@@ -0,0 +1,147 @@
+锘縰sing Admin.NET.Core;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FZCZTB.NET.MD
+{
+ /// <summary>
+ /// 鎶曡瘔璐ㄧ枒缁撴灉
+ /// </summary>
+ [SugarTable("FB_ProcurementComplaints")]
+ public partial class ProcurementComplaint: EntityBase
+ {
+ /// <summary>
+ /// 鎶曡瘔ID锛屼富閿�
+ /// </summary>
+ [SugarColumn(IsPrimaryKey = true)]
+ public Guid Id { get; set; }
+
+ /// <summary>
+ /// 椤圭洰缂栧彿
+ /// </summary>
+ [SugarColumn(Length = 50, IsNullable = false, ColumnDescription = "椤圭洰缂栧彿")]
+ public string ProjectCode { get; set; }
+
+ /// <summary>
+ /// 椤圭洰鍚嶇О
+ /// </summary>
+ [SugarColumn(Length = 200, IsNullable = false, ColumnDescription = "椤圭洰鍚嶇О")]
+ public string ProjectName { get; set; }
+
+ /// <summary>
+ /// 鍐冲畾鏃ユ湡
+ /// </summary>
+ [SugarColumn(IsNullable = false, ColumnDescription = "鍐冲畾鏃ユ湡")]
+ public DateTime DecisionDate { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浜�
+ /// </summary>
+ [SugarColumn(Length = 100, IsNullable = false, ColumnDescription = "閲囪喘浜�")]
+ public string Purchaser { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浠g悊鏈烘瀯
+ /// </summary>
+ [SugarColumn(Length = 100, IsNullable = false, ColumnDescription = "閲囪喘浠g悊鏈烘瀯")]
+ public string ProcurementAgency { get; set; }
+
+ /// <summary>
+ /// 鎶曡瘔浜�
+ /// </summary>
+ [SugarColumn(Length = 100, IsNullable = false, ColumnDescription = "鎶曡瘔浜�")]
+ public string? Complainant { get; set; }
+
+
+
+
+
+ /// <summary>
+ /// 閲囪喘鐩戠潱閮ㄩ棬
+ /// </summary>
+ [SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "閲囪喘鐩戠潱閮ㄩ棬")]
+ public string? ProcurementSupervisionDepartment { get; set; }
+
+ /// <summary>
+ /// 绾夸笂鍦板潃
+ /// </summary>
+ [SugarColumn(Length = 255, IsNullable = true, ColumnDescription = "绾夸笂鍦板潃")]
+ public string Url { get; set; }
+
+ /// <summary>
+ /// 鎶曡瘔浜嬮」
+ /// </summary>
+ [Navigate(NavigateType.OneToMany,nameof(ProcurementComplaintItems.ComplaintId))]
+ public List<ProcurementComplaintItems>? Complaints { get; set; }
+ }
+
+
+ /// <summary>
+ /// 鎶曡瘔浜嬮」瀛愯〃妯″瀷
+ /// </summary>
+ [SugarTable("FB_ProcurementComplaintItems")]
+ public partial class ProcurementComplaintItems
+ {
+ /// <summary>
+ /// 鎶曡瘔浜嬮」ID锛屼富閿�
+ /// </summary>
+ [SugarColumn(IsPrimaryKey = true)]
+ public Guid Id { get; set; }
+
+ /// <summary>
+ /// 鍏宠仈鐨勪富鎶曡瘔ID
+ /// </summary>
+ [SugarColumn(IsNullable = false, ColumnDescription = "鍏宠仈鐨勪富鎶曡瘔ID")]
+ public Guid ComplaintId { get; set; }
+
+ /// <summary>
+ /// 鍏蜂綋鎶曡瘔浜嬮」
+ /// </summary>
+ [SugarColumn(Length = 1000, IsNullable = false, ColumnDescription = "鍏蜂綋鎶曡瘔浜嬮」")]
+ public string ItemDescription { get; set; }
+
+ /// <summary>
+ /// 澶勭悊缁撴灉
+ /// </summary>
+ [SugarColumn(IsNullable = true, ColumnDescription = "澶勭悊缁撴灉")]
+ public PComplaintStatus HandlingStatus { get; set; }
+ /// <summary>
+ /// 澶勭悊鎻忚堪
+ /// </summary>
+ [SugarColumn(Length = 1000,IsNullable = true, ColumnDescription = "澶勭悊缁撴灉")]
+ public string? HandlingResult { get; set; }
+ }
+
+ public enum PComplaintStatus
+ {
+ /// <summary>
+ /// 鍏朵粬
+ /// </summary>
+ Other = 0,
+ /// <summary>
+ /// 鎴愮珛
+ /// </summary>
+ Valid = 1,
+
+ /// <summary>
+ /// 椹冲洖
+ /// </summary>
+ Rejected = 2,
+
+ /// <summary>
+ /// 閮ㄥ垎鎴愮珛
+ /// </summary>
+ PartiallyValid = 3
+
+
+ }
+
+
+
+ }
+
+
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintDto.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintDto.cs
new file mode 100644
index 0000000..6a168f7
--- /dev/null
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintDto.cs
@@ -0,0 +1,89 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace FZCZTB.TSCL.Application;
+
+/// <summary>
+/// 鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊杈撳嚭鍙傛暟
+/// </summary>
+public class ProcurementComplaintDto
+{
+ /// <summary>
+ /// 涓婚敭Id
+ /// </summary>
+ public Guid Id { get; set; }
+
+ /// <summary>
+ /// 椤圭洰缂栧彿
+ /// </summary>
+ public string ProjectCode { get; set; }
+
+ /// <summary>
+ /// 椤圭洰鍚嶇О
+ /// </summary>
+ public string ProjectName { get; set; }
+
+ /// <summary>
+ /// 鍐冲畾鏃ユ湡
+ /// </summary>
+ public DateTime DecisionDate { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浜�
+ /// </summary>
+ public string Purchaser { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浠g悊鏈烘瀯
+ /// </summary>
+ public string ProcurementAgency { get; set; }
+
+ /// <summary>
+ /// 鎶曡瘔浜�
+ /// </summary>
+ public string? Complainant { get; set; }
+
+ /// <summary>
+ /// 閲囪喘鐩戠潱閮ㄩ棬
+ /// </summary>
+ public string? ProcurementSupervisionDepartment { get; set; }
+
+ /// <summary>
+ /// 绾夸笂鍦板潃
+ /// </summary>
+ public string? Url { get; set; }
+
+ /// <summary>
+ /// 鍒涘缓鏃堕棿
+ /// </summary>
+ public DateTime? CreateTime { get; set; }
+
+ /// <summary>
+ /// 鏇存柊鏃堕棿
+ /// </summary>
+ public DateTime? UpdateTime { get; set; }
+
+ /// <summary>
+ /// 鍒涘缓鑰匢d
+ /// </summary>
+ public long? CreateUserId { get; set; }
+
+ /// <summary>
+ /// 鍒涘缓鑰呭鍚�
+ /// </summary>
+ public string? CreateUserName { get; set; }
+
+ /// <summary>
+ /// 淇敼鑰匢d
+ /// </summary>
+ public long? UpdateUserId { get; set; }
+
+ /// <summary>
+ /// 淇敼鑰呭鍚�
+ /// </summary>
+ public string? UpdateUserName { get; set; }
+
+}
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs
new file mode 100644
index 0000000..547c953
--- /dev/null
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs
@@ -0,0 +1,334 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+using System.ComponentModel.DataAnnotations;
+using Magicodes.ExporterAndImporter.Core;
+using Magicodes.ExporterAndImporter.Excel;
+using FZCZTB.NET.MD;
+
+namespace FZCZTB.TSCL.Application;
+
+/// <summary>
+/// 鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊鍩虹杈撳叆鍙傛暟
+/// </summary>
+public class ProcurementComplaintBaseInput
+{
+ /// <summary>
+ /// 涓婚敭Id
+ /// </summary>
+ public virtual Guid Id { get; set; }
+
+ /// <summary>
+ /// 椤圭洰缂栧彿
+ /// </summary>
+ [Required(ErrorMessage = "椤圭洰缂栧彿涓嶈兘涓虹┖")]
+ public virtual string ProjectCode { get; set; }
+
+ /// <summary>
+ /// 椤圭洰鍚嶇О
+ /// </summary>
+ [Required(ErrorMessage = "椤圭洰鍚嶇О涓嶈兘涓虹┖")]
+ public virtual string ProjectName { get; set; }
+
+ /// <summary>
+ /// 鍐冲畾鏃ユ湡
+ /// </summary>
+ [Required(ErrorMessage = "鍐冲畾鏃ユ湡涓嶈兘涓虹┖")]
+ public virtual DateTime DecisionDate { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浜�
+ /// </summary>
+ [Required(ErrorMessage = "閲囪喘浜轰笉鑳戒负绌�")]
+ public virtual string Purchaser { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浠g悊鏈烘瀯
+ /// </summary>
+ [Required(ErrorMessage = "閲囪喘浠g悊鏈烘瀯涓嶈兘涓虹┖")]
+ public virtual string ProcurementAgency { get; set; }
+
+ /// <summary>
+ /// 鎶曡瘔浜�
+ /// </summary>
+ public virtual string? Complainant { get; set; }
+
+ /// <summary>
+ /// 閲囪喘鐩戠潱閮ㄩ棬
+ /// </summary>
+ public virtual string? ProcurementSupervisionDepartment { get; set; }
+
+ /// <summary>
+ /// 绾夸笂鍦板潃
+ /// </summary>
+ public virtual string? Url { get; set; }
+
+}
+
+/// <summary>
+/// 鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊鍒嗛〉鏌ヨ杈撳叆鍙傛暟
+/// </summary>
+public class PageProcurementComplaintInput : BasePageInput
+{
+ /// <summary>
+ /// 椤圭洰缂栧彿
+ /// </summary>
+ public string ProjectCode { get; set; }
+
+ /// <summary>
+ /// 椤圭洰鍚嶇О
+ /// </summary>
+ public string ProjectName { get; set; }
+
+ /// <summary>
+ /// 鍐冲畾鏃ユ湡鑼冨洿
+ /// </summary>
+ public DateTime?[] DecisionDateRange { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浜�
+ /// </summary>
+ public string Purchaser { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浠g悊鏈烘瀯
+ /// </summary>
+ public string ProcurementAgency { get; set; }
+
+ /// <summary>
+ /// 鎶曡瘔浜�
+ /// </summary>
+ public string? Complainant { get; set; }
+
+ /// <summary>
+ /// 閲囪喘鐩戠潱閮ㄩ棬
+ /// </summary>
+ public string? ProcurementSupervisionDepartment { get; set; }
+
+ /// <summary>
+ /// 绾夸笂鍦板潃
+ /// </summary>
+ public string? Url { get; set; }
+
+ /// <summary>
+ /// 閫変腑涓婚敭鍒楄〃
+ /// </summary>
+ public List<Guid> SelectKeyList { get; set; }
+}
+
+/// <summary>
+/// 鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊澧炲姞杈撳叆鍙傛暟
+/// </summary>
+public class AddProcurementComplaintInput
+{
+ /// <summary>
+ /// 椤圭洰缂栧彿
+ /// </summary>
+ [Required(ErrorMessage = "椤圭洰缂栧彿涓嶈兘涓虹┖")]
+ [MaxLength(50, ErrorMessage = "椤圭洰缂栧彿瀛楃闀垮害涓嶈兘瓒呰繃50")]
+ public string ProjectCode { get; set; }
+
+ /// <summary>
+ /// 椤圭洰鍚嶇О
+ /// </summary>
+ [Required(ErrorMessage = "椤圭洰鍚嶇О涓嶈兘涓虹┖")]
+ [MaxLength(200, ErrorMessage = "椤圭洰鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃200")]
+ public string ProjectName { get; set; }
+
+ /// <summary>
+ /// 鍐冲畾鏃ユ湡
+ /// </summary>
+ [Required(ErrorMessage = "鍐冲畾鏃ユ湡涓嶈兘涓虹┖")]
+ public DateTime DecisionDate { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浜�
+ /// </summary>
+ [Required(ErrorMessage = "閲囪喘浜轰笉鑳戒负绌�")]
+ [MaxLength(100, ErrorMessage = "閲囪喘浜哄瓧绗﹂暱搴︿笉鑳借秴杩�100")]
+ public string Purchaser { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浠g悊鏈烘瀯
+ /// </summary>
+ [Required(ErrorMessage = "閲囪喘浠g悊鏈烘瀯涓嶈兘涓虹┖")]
+ [MaxLength(100, ErrorMessage = "閲囪喘浠g悊鏈烘瀯瀛楃闀垮害涓嶈兘瓒呰繃100")]
+ public string ProcurementAgency { get; set; }
+
+ /// <summary>
+ /// 鎶曡瘔浜�
+ /// </summary>
+ [MaxLength(100, ErrorMessage = "鎶曡瘔浜哄瓧绗﹂暱搴︿笉鑳借秴杩�100")]
+ public string? Complainant { get; set; }
+
+ /// <summary>
+ /// 閲囪喘鐩戠潱閮ㄩ棬
+ /// </summary>
+ [MaxLength(100, ErrorMessage = "閲囪喘鐩戠潱閮ㄩ棬瀛楃闀垮害涓嶈兘瓒呰繃100")]
+ public string? ProcurementSupervisionDepartment { get; set; }
+
+ /// <summary>
+ /// 绾夸笂鍦板潃
+ /// </summary>
+ [MaxLength(255, ErrorMessage = "绾夸笂鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃255")]
+ public string? Url { get; set; }
+
+ /// <summary>
+ /// 鎶曡瘔浜嬮」
+ /// </summary>
+ public List<ProcurementComplaintItems>? Complaints { get; set; }
+}
+
+/// <summary>
+/// 鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊鍒犻櫎杈撳叆鍙傛暟
+/// </summary>
+public class DeleteProcurementComplaintInput
+{
+ /// <summary>
+ /// 涓婚敭Id
+ /// </summary>
+ [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+ public Guid Id { get; set; }
+
+}
+
+/// <summary>
+/// 鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊鏇存柊杈撳叆鍙傛暟
+/// </summary>
+public class UpdateProcurementComplaintInput
+{
+ /// <summary>
+ /// 涓婚敭Id
+ /// </summary>
+ [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+ public Guid Id { get; set; }
+
+ /// <summary>
+ /// 椤圭洰缂栧彿
+ /// </summary>
+ [Required(ErrorMessage = "椤圭洰缂栧彿涓嶈兘涓虹┖")]
+ [MaxLength(50, ErrorMessage = "椤圭洰缂栧彿瀛楃闀垮害涓嶈兘瓒呰繃50")]
+ public string ProjectCode { get; set; }
+
+ /// <summary>
+ /// 椤圭洰鍚嶇О
+ /// </summary>
+ [Required(ErrorMessage = "椤圭洰鍚嶇О涓嶈兘涓虹┖")]
+ [MaxLength(200, ErrorMessage = "椤圭洰鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃200")]
+ public string ProjectName { get; set; }
+
+ /// <summary>
+ /// 鍐冲畾鏃ユ湡
+ /// </summary>
+ [Required(ErrorMessage = "鍐冲畾鏃ユ湡涓嶈兘涓虹┖")]
+ public DateTime DecisionDate { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浜�
+ /// </summary>
+ [Required(ErrorMessage = "閲囪喘浜轰笉鑳戒负绌�")]
+ [MaxLength(100, ErrorMessage = "閲囪喘浜哄瓧绗﹂暱搴︿笉鑳借秴杩�100")]
+ public string Purchaser { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浠g悊鏈烘瀯
+ /// </summary>
+ [Required(ErrorMessage = "閲囪喘浠g悊鏈烘瀯涓嶈兘涓虹┖")]
+ [MaxLength(100, ErrorMessage = "閲囪喘浠g悊鏈烘瀯瀛楃闀垮害涓嶈兘瓒呰繃100")]
+ public string ProcurementAgency { get; set; }
+
+ /// <summary>
+ /// 鎶曡瘔浜�
+ /// </summary>
+ [MaxLength(100, ErrorMessage = "鎶曡瘔浜哄瓧绗﹂暱搴︿笉鑳借秴杩�100")]
+ public string? Complainant { get; set; }
+
+ /// <summary>
+ /// 閲囪喘鐩戠潱閮ㄩ棬
+ /// </summary>
+ [MaxLength(100, ErrorMessage = "閲囪喘鐩戠潱閮ㄩ棬瀛楃闀垮害涓嶈兘瓒呰繃100")]
+ public string? ProcurementSupervisionDepartment { get; set; }
+
+ /// <summary>
+ /// 绾夸笂鍦板潃
+ /// </summary>
+ [MaxLength(255, ErrorMessage = "绾夸笂鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃255")]
+ public string? Url { get; set; }
+
+}
+
+/// <summary>
+/// 鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊涓婚敭鏌ヨ杈撳叆鍙傛暟
+/// </summary>
+public class QueryByIdProcurementComplaintInput : DeleteProcurementComplaintInput
+{
+}
+
+/// <summary>
+/// 鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊鏁版嵁瀵煎叆瀹炰綋
+/// </summary>
+[ExcelImporter(SheetIndex = 1, IsOnlyErrorRows = true)]
+public class ImportProcurementComplaintInput : BaseImportInput
+{
+
+ /// <summary>
+ /// 椤圭洰缂栧彿
+ /// </summary>
+ [ImporterHeader(Name = "*椤圭洰缂栧彿")]
+ [ExporterHeader("*椤圭洰缂栧彿", Format = "", Width = 25, IsBold = true)]
+ public string ProjectCode { get; set; }
+
+ /// <summary>
+ /// 椤圭洰鍚嶇О
+ /// </summary>
+ [ImporterHeader(Name = "*椤圭洰鍚嶇О")]
+ [ExporterHeader("*椤圭洰鍚嶇О", Format = "", Width = 25, IsBold = true)]
+ public string ProjectName { get; set; }
+
+ /// <summary>
+ /// 鍐冲畾鏃ユ湡
+ /// </summary>
+ [ImporterHeader(Name = "*鍐冲畾鏃ユ湡")]
+ [ExporterHeader("*鍐冲畾鏃ユ湡", Format = "", Width = 25, IsBold = true)]
+ public DateTime DecisionDate { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浜�
+ /// </summary>
+ [ImporterHeader(Name = "*閲囪喘浜�")]
+ [ExporterHeader("*閲囪喘浜�", Format = "", Width = 25, IsBold = true)]
+ public string Purchaser { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浠g悊鏈烘瀯
+ /// </summary>
+ [ImporterHeader(Name = "*閲囪喘浠g悊鏈烘瀯")]
+ [ExporterHeader("*閲囪喘浠g悊鏈烘瀯", Format = "", Width = 25, IsBold = true)]
+ public string ProcurementAgency { get; set; }
+
+ /// <summary>
+ /// 鎶曡瘔浜�
+ /// </summary>
+ [ImporterHeader(Name = "鎶曡瘔浜�")]
+ [ExporterHeader("鎶曡瘔浜�", Format = "", Width = 25, IsBold = true)]
+ public string? Complainant { get; set; }
+
+ /// <summary>
+ /// 閲囪喘鐩戠潱閮ㄩ棬
+ /// </summary>
+ [ImporterHeader(Name = "閲囪喘鐩戠潱閮ㄩ棬")]
+ [ExporterHeader("閲囪喘鐩戠潱閮ㄩ棬", Format = "", Width = 25, IsBold = true)]
+ public string? ProcurementSupervisionDepartment { get; set; }
+
+ /// <summary>
+ /// 绾夸笂鍦板潃
+ /// </summary>
+ [ImporterHeader(Name = "绾夸笂鍦板潃")]
+ [ExporterHeader("绾夸笂鍦板潃", Format = "", Width = 25, IsBold = true)]
+ public string? Url { get; set; }
+
+}
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs
new file mode 100644
index 0000000..86a7e3f
--- /dev/null
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs
@@ -0,0 +1,101 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+using Magicodes.ExporterAndImporter.Core;
+namespace FZCZTB.TSCL.Application;
+
+/// <summary>
+/// 鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊杈撳嚭鍙傛暟
+/// </summary>
+public class ProcurementComplaintOutput
+{
+ /// <summary>
+ /// 涓婚敭Id
+ /// </summary>
+ public Guid Id { get; set; }
+
+ /// <summary>
+ /// 椤圭洰缂栧彿
+ /// </summary>
+ public string ProjectCode { get; set; }
+
+ /// <summary>
+ /// 椤圭洰鍚嶇О
+ /// </summary>
+ public string ProjectName { get; set; }
+
+ /// <summary>
+ /// 鍐冲畾鏃ユ湡
+ /// </summary>
+ public DateTime DecisionDate { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浜�
+ /// </summary>
+ public string Purchaser { get; set; }
+
+ /// <summary>
+ /// 閲囪喘浠g悊鏈烘瀯
+ /// </summary>
+ public string ProcurementAgency { get; set; }
+
+ /// <summary>
+ /// 鎶曡瘔浜�
+ /// </summary>
+ public string? Complainant { get; set; }
+
+ /// <summary>
+ /// 閲囪喘鐩戠潱閮ㄩ棬
+ /// </summary>
+ public string? ProcurementSupervisionDepartment { get; set; }
+
+ /// <summary>
+ /// 绾夸笂鍦板潃
+ /// </summary>
+ public string? Url { get; set; }
+
+ /// <summary>
+ /// 鍒涘缓鏃堕棿
+ /// </summary>
+ public DateTime? CreateTime { get; set; }
+
+ /// <summary>
+ /// 鏇存柊鏃堕棿
+ /// </summary>
+ public DateTime? UpdateTime { get; set; }
+
+ /// <summary>
+ /// 鍒涘缓鑰匢d
+ /// </summary>
+ public long? CreateUserId { get; set; }
+
+ /// <summary>
+ /// 鍒涘缓鑰呭鍚�
+ /// </summary>
+ public string? CreateUserName { get; set; }
+
+ /// <summary>
+ /// 淇敼鑰匢d
+ /// </summary>
+ public long? UpdateUserId { get; set; }
+
+ /// <summary>
+ /// 淇敼鑰呭鍚�
+ /// </summary>
+ public string? UpdateUserName { get; set; }
+
+}
+
+/// <summary>
+/// 鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊鏁版嵁瀵煎叆妯℃澘瀹炰綋
+/// </summary>
+public class ExportProcurementComplaintOutput : ImportProcurementComplaintInput
+{
+ [ImporterHeader(IsIgnore = true)]
+ [ExporterHeader(IsIgnore = true)]
+ public override string Error { get; set; }
+
+
+}
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs
new file mode 100644
index 0000000..ba9bcc3
--- /dev/null
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs
@@ -0,0 +1,212 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core.Service;
+using Microsoft.AspNetCore.Http;
+
+using Furion.DatabaseAccessor;
+using Furion.FriendlyException;
+using Mapster;
+using SqlSugar;
+using System.ComponentModel;
+using System.ComponentModel.DataAnnotations;
+using Microsoft.AspNetCore.Mvc;
+using Admin.NET.Application;
+using Admin.NET.Core;
+using FZCZTB.NET.MD;
+using Furion.DynamicApiController;
+using Furion.DependencyInjection;
+using System.Collections.Generic;
+using System.Linq;
+using NewLife.Xml;
+using AngleSharp.Dom;
+namespace FZCZTB.TSCL.Application;
+
+/// <summary>
+/// 鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊鏈嶅姟 馃З
+/// </summary>
+[ApiDescriptionSettings(ApplicationConst.GroupName, Order = 100)]
+public class ProcurementComplaintService : IDynamicApiController, ITransient
+{
+ private readonly SqlSugarRepository<ProcurementComplaint> _procurementComplaintRep;
+ private readonly ISqlSugarClient _sqlSugarClient;
+
+ public ProcurementComplaintService(SqlSugarRepository<ProcurementComplaint> procurementComplaintRep, ISqlSugarClient sqlSugarClient)
+ {
+ _procurementComplaintRep = procurementComplaintRep;
+ _sqlSugarClient = sqlSugarClient;
+ }
+
+ /// <summary>
+ /// 鍒嗛〉鏌ヨ鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊 馃敄
+ /// </summary>
+ /// <param name="input"></param>
+ /// <returns></returns>
+ [DisplayName("鍒嗛〉鏌ヨ鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊")]
+ [ApiDescriptionSettings(Name = "Page"), HttpPost]
+ public async Task<SqlSugarPagedList<ProcurementComplaintOutput>> Page(PageProcurementComplaintInput input)
+ {
+ input.Keyword = input.Keyword?.Trim();
+ var query = _procurementComplaintRep.AsQueryable()
+ .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.ProjectCode.Contains(input.Keyword) || u.ProjectName.Contains(input.Keyword) || u.Purchaser.Contains(input.Keyword) || u.ProcurementAgency.Contains(input.Keyword) || u.Complainant.Contains(input.Keyword) || u.ProcurementSupervisionDepartment.Contains(input.Keyword) || u.Url.Contains(input.Keyword))
+ .WhereIF(!string.IsNullOrWhiteSpace(input.ProjectCode), u => u.ProjectCode.Contains(input.ProjectCode.Trim()))
+ .WhereIF(!string.IsNullOrWhiteSpace(input.ProjectName), u => u.ProjectName.Contains(input.ProjectName.Trim()))
+ .WhereIF(!string.IsNullOrWhiteSpace(input.Purchaser), u => u.Purchaser.Contains(input.Purchaser.Trim()))
+ .WhereIF(!string.IsNullOrWhiteSpace(input.ProcurementAgency), u => u.ProcurementAgency.Contains(input.ProcurementAgency.Trim()))
+ .WhereIF(!string.IsNullOrWhiteSpace(input.Complainant), u => u.Complainant.Contains(input.Complainant.Trim()))
+ .WhereIF(!string.IsNullOrWhiteSpace(input.ProcurementSupervisionDepartment), u => u.ProcurementSupervisionDepartment.Contains(input.ProcurementSupervisionDepartment.Trim()))
+ .WhereIF(!string.IsNullOrWhiteSpace(input.Url), u => u.Url.Contains(input.Url.Trim()))
+ .WhereIF(input.DecisionDateRange?.Length == 2, u => u.DecisionDate >= input.DecisionDateRange[0] && u.DecisionDate <= input.DecisionDateRange[1])
+ .Select<ProcurementComplaintOutput>();
+ return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
+ }
+
+ /// <summary>
+ /// 鑾峰彇鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊璇︽儏 鈩癸笍
+ /// </summary>
+ /// <param name="input"></param>
+ /// <returns></returns>
+ [DisplayName("鑾峰彇鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊璇︽儏")]
+ [ApiDescriptionSettings(Name = "Detail"), HttpGet]
+ public async Task<ProcurementComplaint> Detail([FromQuery] QueryByIdProcurementComplaintInput input)
+ {
+ return await _procurementComplaintRep.GetFirstAsync(u => u.Id == input.Id);
+ }
+
+ /// <summary>
+ /// 澧炲姞鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊 鉃�
+ /// </summary>
+ /// <param name="input"></param>
+ /// <returns></returns>
+ [DisplayName("澧炲姞鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊")]
+ [ApiDescriptionSettings(Name = "Add"), HttpPost]
+ public async Task<bool> Add(AddProcurementComplaintInput input)
+ {
+ var entity = input.Adapt<ProcurementComplaint>();
+ entity.Id = Guid.NewGuid();
+
+ return await _sqlSugarClient.InsertNav(entity).Include(x=>x.Complaints).ExecuteCommandAsync();
+ }
+
+ /// <summary>
+ /// 鏇存柊鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊 鉁忥笍
+ /// </summary>
+ /// <param name="input"></param>
+ /// <returns></returns>
+ [DisplayName("鏇存柊鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊")]
+ [ApiDescriptionSettings(Name = "Update"), HttpPost]
+ public async Task Update(UpdateProcurementComplaintInput input)
+ {
+ var entity = input.Adapt<ProcurementComplaint>();
+ await _procurementComplaintRep.AsUpdateable(entity)
+ .ExecuteCommandAsync();
+ }
+
+ /// <summary>
+ /// 鍒犻櫎鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊 鉂�
+ /// </summary>
+ /// <param name="input"></param>
+ /// <returns></returns>
+ [DisplayName("鍒犻櫎鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊")]
+ [ApiDescriptionSettings(Name = "Delete"), HttpPost]
+ public async Task Delete(DeleteProcurementComplaintInput input)
+ {
+ //var entity = await _procurementComplaintRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+ var entity = await _sqlSugarClient.Queryable<ProcurementComplaint>().Includes(x=>x.Complaints).Where(x=>x.Id== input.Id).FirstAsync() ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+ //await _procurementComplaintRep.FakeDeleteAsync(entity); //鍋囧垹闄�
+ await _sqlSugarClient.DeleteNav(entity).Include(x => x.Complaints).ExecuteCommandAsync(); //鐪熷垹闄�
+ }
+
+ /// <summary>
+ /// 鎵归噺鍒犻櫎鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊 鉂�
+ /// </summary>
+ /// <param name="input"></param>
+ /// <returns></returns>
+ [DisplayName("鎵归噺鍒犻櫎鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊")]
+ [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost]
+ public async Task<bool > BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")]List<DeleteProcurementComplaintInput> input)
+ {
+ var exp = Expressionable.Create<ProcurementComplaint>();
+ foreach (var row in input) exp = exp.Or(it => it.Id == row.Id);
+ var list = await _procurementComplaintRep.AsQueryable().Where(exp.ToExpression()).ToListAsync();
+
+ // return await _procurementComplaintRep.FakeDeleteAsync(list); //鍋囧垹闄�
+ return await _sqlSugarClient.DeleteNav(list).Include(x => x.Complaints).ExecuteCommandAsync(); ; //鐪熷垹闄�
+ }
+
+ /// <summary>
+ /// 瀵煎嚭鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊璁板綍 馃敄
+ /// </summary>
+ /// <param name="input"></param>
+ /// <returns></returns>
+ [DisplayName("瀵煎嚭鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊璁板綍")]
+ [ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify]
+ public async Task<IActionResult> Export(PageProcurementComplaintInput input)
+ {
+ var list = (await Page(input)).Items?.Adapt<List<ExportProcurementComplaintOutput>>() ?? new();
+ //if (input.SelectKeyList?.Count > 0) list = list.Where(x => input.SelectKeyList.Contains(x.Id)).ToList();
+ return ExcelHelper.ExportTemplate(list, "鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊瀵煎嚭璁板綍");
+ }
+
+ /// <summary>
+ /// 涓嬭浇鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊鏁版嵁瀵煎叆妯℃澘 猬囷笍
+ /// </summary>
+ /// <returns></returns>
+ [DisplayName("涓嬭浇鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊鏁版嵁瀵煎叆妯℃澘")]
+ [ApiDescriptionSettings(Name = "Import"), HttpGet, NonUnify]
+ public IActionResult DownloadTemplate()
+ {
+ return ExcelHelper.ExportTemplate(new List<ExportProcurementComplaintOutput>(), "鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊瀵煎叆妯℃澘");
+ }
+
+ private static readonly object _procurementComplaintImportLock = new object();
+ /// <summary>
+ /// 瀵煎叆鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊璁板綍 馃捑
+ /// </summary>
+ /// <returns></returns>
+ [DisplayName("瀵煎叆鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊璁板綍")]
+ [ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork]
+ public IActionResult ImportData([Required] IFormFile file)
+ {
+ lock (_procurementComplaintImportLock)
+ {
+ var stream = ExcelHelper.ImportData<ImportProcurementComplaintInput, ProcurementComplaint>(file, (list, markerErrorAction) =>
+ {
+ _sqlSugarClient.Utilities.PageEach(list, 2048, pageItems =>
+ {
+
+ // 鏍¢獙骞惰繃婊ゅ繀濉熀鏈被鍨嬩负null鐨勫瓧娈�
+ var rows = pageItems.Where(x => {
+ return true;
+ }).Adapt<List<ProcurementComplaint>>();
+
+ var storageable = _procurementComplaintRep.Context.Storageable(rows)
+ .SplitError(it => string.IsNullOrWhiteSpace(it.Item.ProjectCode), "椤圭洰缂栧彿涓嶈兘涓虹┖")
+ .SplitError(it => it.Item.ProjectCode?.Length > 50, "椤圭洰缂栧彿闀垮害涓嶈兘瓒呰繃50涓瓧绗�")
+ .SplitError(it => string.IsNullOrWhiteSpace(it.Item.ProjectName), "椤圭洰鍚嶇О涓嶈兘涓虹┖")
+ .SplitError(it => it.Item.ProjectName?.Length > 200, "椤圭洰鍚嶇О闀垮害涓嶈兘瓒呰繃200涓瓧绗�")
+ .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Purchaser), "閲囪喘浜轰笉鑳戒负绌�")
+ .SplitError(it => it.Item.Purchaser?.Length > 100, "閲囪喘浜洪暱搴︿笉鑳借秴杩�100涓瓧绗�")
+ .SplitError(it => string.IsNullOrWhiteSpace(it.Item.ProcurementAgency), "閲囪喘浠g悊鏈烘瀯涓嶈兘涓虹┖")
+ .SplitError(it => it.Item.ProcurementAgency?.Length > 100, "閲囪喘浠g悊鏈烘瀯闀垮害涓嶈兘瓒呰繃100涓瓧绗�")
+ .SplitError(it => it.Item.Complainant?.Length > 100, "鎶曡瘔浜洪暱搴︿笉鑳借秴杩�100涓瓧绗�")
+ .SplitError(it => it.Item.ProcurementSupervisionDepartment?.Length > 100, "閲囪喘鐩戠潱閮ㄩ棬闀垮害涓嶈兘瓒呰繃100涓瓧绗�")
+ .SplitError(it => it.Item.Url?.Length > 255, "绾夸笂鍦板潃闀垮害涓嶈兘瓒呰繃255涓瓧绗�")
+ .SplitInsert(_ => true)
+ .ToStorage();
+
+ storageable.AsInsertable.ExecuteCommand();// 涓嶅瓨鍦ㄦ彃鍏�
+ storageable.AsUpdateable.ExecuteCommand();// 瀛樺湪鏇存柊
+
+ // 鏍囪閿欒淇℃伅
+ markerErrorAction.Invoke(storageable, pageItems, rows);
+ });
+ });
+
+ return stream;
+ }
+ }
+}
diff --git a/Web/src/api/fb_p_complaints/procurementComplaint.ts b/Web/src/api/fb_p_complaints/procurementComplaint.ts
new file mode 100644
index 0000000..7f44ad1
--- /dev/null
+++ b/Web/src/api/fb_p_complaints/procurementComplaint.ts
@@ -0,0 +1,60 @@
+锘縤mport {useBaseApi} from '/@/api/base';
+
+// 鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊鎺ュ彛鏈嶅姟
+export const useProcurementComplaintApi = () => {
+ const baseApi = useBaseApi("procurementComplaint");
+ return {
+ // 鍒嗛〉鏌ヨ鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊
+ page: baseApi.page,
+ // 鏌ョ湅鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊璇︾粏
+ detail: baseApi.detail,
+ // 鏂板鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊
+ add: baseApi.add,
+ // 鏇存柊鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊
+ update: baseApi.update,
+ // 鍒犻櫎鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊
+ delete: baseApi.delete,
+ // 鎵归噺鍒犻櫎鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊
+ batchDelete: baseApi.batchDelete,
+ // 瀵煎嚭鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊鏁版嵁
+ exportData: baseApi.exportData,
+ // 瀵煎叆鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊鏁版嵁
+ importData: baseApi.importData,
+ // 涓嬭浇鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊鏁版嵁瀵煎叆妯℃澘
+ downloadTemplate: baseApi.downloadTemplate,
+ }
+}
+
+// 鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊瀹炰綋
+export interface ProcurementComplaint {
+ // 涓婚敭Id
+ id: string;
+ // 椤圭洰缂栧彿
+ projectCode?: string;
+ // 椤圭洰鍚嶇О
+ projectName?: string;
+ // 鍐冲畾鏃ユ湡
+ decisionDate?: string;
+ // 閲囪喘浜�
+ purchaser?: string;
+ // 閲囪喘浠g悊鏈烘瀯
+ procurementAgency?: string;
+ // 鎶曡瘔浜�
+ complainant: string;
+ // 閲囪喘鐩戠潱閮ㄩ棬
+ procurementSupervisionDepartment: string;
+ // 绾夸笂鍦板潃
+ url: string;
+ // 鍒涘缓鏃堕棿
+ createTime: string;
+ // 鏇存柊鏃堕棿
+ updateTime: string;
+ // 鍒涘缓鑰匢d
+ createUserId: number;
+ // 鍒涘缓鑰呭鍚�
+ createUserName: string;
+ // 淇敼鑰匢d
+ updateUserId: number;
+ // 淇敼鑰呭鍚�
+ updateUserName: string;
+}
\ No newline at end of file
diff --git a/Web/src/views/fb_p_complaints/procurementComplaint/component/editDialog.vue b/Web/src/views/fb_p_complaints/procurementComplaint/component/editDialog.vue
new file mode 100644
index 0000000..3bad527
--- /dev/null
+++ b/Web/src/views/fb_p_complaints/procurementComplaint/component/editDialog.vue
@@ -0,0 +1,136 @@
+锘�<script lang="ts" name="procurementComplaint" setup>
+import { ref, reactive, onMounted } from "vue";
+import { ElMessage } from "element-plus";
+import type { FormRules } from "element-plus";
+import { formatDate } from '/@/utils/formatTime';
+import { useProcurementComplaintApi } from '/@/api/fb_p_complaints/procurementComplaint';
+
+//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟
+const emit = defineEmits(["reloadTable"]);
+const procurementComplaintApi = useProcurementComplaintApi();
+const ruleFormRef = ref();
+
+const state = reactive({
+ title: '',
+ loading: false,
+ showDialog: false,
+ ruleForm: {} as any,
+ stores: {},
+ dropdownData: {} as any,
+});
+
+// 鑷娣诲姞鍏朵粬瑙勫垯
+const rules = ref<FormRules>({
+ projectCode: [{required: true, message: '璇烽�夋嫨椤圭洰缂栧彿锛�', trigger: 'blur',},],
+ projectName: [{required: true, message: '璇烽�夋嫨椤圭洰鍚嶇О锛�', trigger: 'blur',},],
+ decisionDate: [{required: true, message: '璇烽�夋嫨鍐冲畾鏃ユ湡锛�', trigger: 'change',},],
+ purchaser: [{required: true, message: '璇烽�夋嫨閲囪喘浜猴紒', trigger: 'blur',},],
+ procurementAgency: [{required: true, message: '璇烽�夋嫨閲囪喘浠g悊鏈烘瀯锛�', trigger: 'blur',},],
+});
+
+// 椤甸潰鍔犺浇鏃�
+onMounted(async () => {
+});
+
+// 鎵撳紑寮圭獥
+const openDialog = async (row: any, title: string) => {
+ state.title = title;
+ row = row ?? { };
+ state.ruleForm = row.id ? await procurementComplaintApi.detail(row.id).then(res => res.data.result) : JSON.parse(JSON.stringify(row));
+ state.showDialog = true;
+};
+
+// 鍏抽棴寮圭獥
+const closeDialog = () => {
+ emit("reloadTable");
+ state.showDialog = false;
+};
+
+// 鎻愪氦
+const submit = async () => {
+ ruleFormRef.value.validate(async (isValid: boolean, fields?: any) => {
+ if (isValid) {
+ let values = state.ruleForm;
+ await procurementComplaintApi[state.ruleForm.id ? 'update' : 'add'](values);
+ closeDialog();
+ } else {
+ ElMessage({
+ message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜,
+ type: "error",
+ });
+ }
+ });
+};
+
+//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠�
+defineExpose({ openDialog });
+</script>
+<template>
+ <div class="procurementComplaint-container">
+ <el-dialog v-model="state.showDialog" :width="800" draggable :close-on-click-modal="false">
+ <template #header>
+ <div style="color: #fff">
+ <span>{{ state.title }}</span>
+ </div>
+ </template>
+ <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto" :rules="rules">
+ <el-row :gutter="35">
+ <el-form-item v-show="false">
+ <el-input v-model="state.ruleForm.id" />
+ </el-form-item>
+ <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+ <el-form-item label="椤圭洰缂栧彿" prop="projectCode">
+ <el-input v-model="state.ruleForm.projectCode" placeholder="璇疯緭鍏ラ」鐩紪鍙�" maxlength="50" show-word-limit clearable />
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+ <el-form-item label="椤圭洰鍚嶇О" prop="projectName">
+ <el-input v-model="state.ruleForm.projectName" placeholder="璇疯緭鍏ラ」鐩悕绉�" maxlength="200" show-word-limit clearable />
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+ <el-form-item label="鍐冲畾鏃ユ湡" prop="decisionDate">
+ <el-date-picker v-model="state.ruleForm.decisionDate" type="date" placeholder="鍐冲畾鏃ユ湡" />
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+ <el-form-item label="閲囪喘浜�" prop="purchaser">
+ <el-input v-model="state.ruleForm.purchaser" placeholder="璇疯緭鍏ラ噰璐汉" maxlength="100" show-word-limit clearable />
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+ <el-form-item label="閲囪喘浠g悊鏈烘瀯" prop="procurementAgency">
+ <el-input v-model="state.ruleForm.procurementAgency" placeholder="璇疯緭鍏ラ噰璐唬鐞嗘満鏋�" maxlength="100" show-word-limit clearable />
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+ <el-form-item label="鎶曡瘔浜�" prop="complainant">
+ <el-input v-model="state.ruleForm.complainant" placeholder="璇疯緭鍏ユ姇璇変汉" maxlength="100" show-word-limit clearable />
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+ <el-form-item label="閲囪喘鐩戠潱閮ㄩ棬" prop="procurementSupervisionDepartment">
+ <el-input v-model="state.ruleForm.procurementSupervisionDepartment" placeholder="璇疯緭鍏ラ噰璐洃鐫i儴闂�" maxlength="100" show-word-limit clearable />
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+ <el-form-item label="绾夸笂鍦板潃" prop="url">
+ <el-input v-model="state.ruleForm.url" placeholder="璇疯緭鍏ョ嚎涓婂湴鍧�" maxlength="255" show-word-limit clearable />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="() => state.showDialog = false">鍙� 娑�</el-button>
+ <el-button @click="submit" type="primary" v-reclick="1000">纭� 瀹�</el-button>
+ </span>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+<style lang="scss" scoped>
+:deep(.el-select), :deep(.el-input-number) {
+ width: 100%;
+}
+</style>
\ No newline at end of file
diff --git a/Web/src/views/fb_p_complaints/procurementComplaint/index.vue b/Web/src/views/fb_p_complaints/procurementComplaint/index.vue
new file mode 100644
index 0000000..0650757
--- /dev/null
+++ b/Web/src/views/fb_p_complaints/procurementComplaint/index.vue
@@ -0,0 +1,224 @@
+锘�<script lang="ts" setup name="procurementComplaint">
+import { ref, reactive, onMounted } from "vue";
+import { auth } from '/@/utils/authFunction';
+import { ElMessageBox, ElMessage } from "element-plus";
+import { downloadStreamFile } from "/@/utils/download";
+import { useProcurementComplaintApi } from '/@/api/fb_p_complaints/procurementComplaint';
+import editDialog from '/@/views/fb_p_complaints/procurementComplaint/component/editDialog.vue'
+import printDialog from '/@/views/system/print/component/hiprint/preview.vue'
+import ModifyRecord from '/@/components/table/modifyRecord.vue';
+import ImportData from "/@/components/table/importData.vue";
+
+const procurementComplaintApi = useProcurementComplaintApi();
+const printDialogRef = ref();
+const editDialogRef = ref();
+const importDataRef = ref();
+const state = reactive({
+ exportLoading: false,
+ tableLoading: false,
+ stores: {},
+ showAdvanceQueryUI: false,
+ dropdownData: {} as any,
+ selectData: [] as any[],
+ tableQueryParams: {} as any,
+ tableParams: {
+ page: 1,
+ pageSize: 20,
+ total: 0,
+ field: 'createTime', // 榛樿鐨勬帓搴忓瓧娈�
+ order: 'descending', // 鎺掑簭鏂瑰悜
+ descStr: 'descending', // 闄嶅簭鎺掑簭鐨勫叧閿瓧绗�
+ },
+ tableData: [],
+});
+
+// 椤甸潰鍔犺浇鏃�
+onMounted(async () => {
+});
+
+// 鏌ヨ鎿嶄綔
+const handleQuery = async (params: any = {}) => {
+ state.tableLoading = true;
+ state.tableParams = Object.assign(state.tableParams, params);
+ const result = await procurementComplaintApi.page(Object.assign(state.tableQueryParams, state.tableParams)).then(res => res.data.result);
+ state.tableParams.total = result?.total;
+ state.tableData = result?.items ?? [];
+ state.tableLoading = false;
+};
+
+// 鍒楁帓搴�
+const sortChange = async (column: any) => {
+ state.tableParams.field = column.prop;
+ state.tableParams.order = column.order;
+ await handleQuery();
+};
+
+// 鍒犻櫎
+const delProcurementComplaint = (row: any) => {
+ ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ }).then(async () => {
+ await procurementComplaintApi.delete({ id: row.id });
+ handleQuery();
+ ElMessage.success("鍒犻櫎鎴愬姛");
+ }).catch(() => {});
+};
+
+// 鎵归噺鍒犻櫎
+const batchDelProcurementComplaint = () => {
+ ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ }).then(async () => {
+ await procurementComplaintApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => {
+ ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤);
+ handleQuery();
+ });
+ }).catch(() => {});
+};
+
+// 瀵煎嚭鏁版嵁
+const exportProcurementComplaintCommand = async (command: string) => {
+ try {
+ state.exportLoading = true;
+ if (command === 'select') {
+ const params = Object.assign({}, state.tableQueryParams, state.tableParams, { selectKeyList: state.selectData.map(u => u.id) });
+ await procurementComplaintApi.exportData(params).then(res => downloadStreamFile(res));
+ } else if (command === 'current') {
+ const params = Object.assign({}, state.tableQueryParams, state.tableParams);
+ await procurementComplaintApi.exportData(params).then(res => downloadStreamFile(res));
+ } else if (command === 'all') {
+ const params = Object.assign({}, state.tableQueryParams, state.tableParams, { page: 1, pageSize: 99999999 });
+ await procurementComplaintApi.exportData(params).then(res => downloadStreamFile(res));
+ }
+ } finally {
+ state.exportLoading = false;
+ }
+}
+
+handleQuery();
+</script>
+<template>
+ <div class="procurementComplaint-container" v-loading="state.exportLoading">
+ <el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
+ <el-form :model="state.tableQueryParams" ref="queryForm" labelWidth="90">
+ <el-row>
+ <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
+ <el-form-item label="鍏抽敭瀛�">
+ <el-input v-model="state.tableQueryParams.keyword" clearable placeholder="璇疯緭鍏ユā绯婃煡璇㈠叧閿瓧"/>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+ <el-form-item label="椤圭洰缂栧彿">
+ <el-input v-model="state.tableQueryParams.projectCode" clearable placeholder="璇疯緭鍏ラ」鐩紪鍙�"/>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+ <el-form-item label="椤圭洰鍚嶇О">
+ <el-input v-model="state.tableQueryParams.projectName" clearable placeholder="璇疯緭鍏ラ」鐩悕绉�"/>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+ <el-form-item label="鍐冲畾鏃ユ湡">
+ <el-date-picker type="daterange" v-model="state.tableQueryParams.decisionDateRange" value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" />
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+ <el-form-item label="閲囪喘浜�">
+ <el-input v-model="state.tableQueryParams.purchaser" clearable placeholder="璇疯緭鍏ラ噰璐汉"/>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+ <el-form-item label="閲囪喘浠g悊鏈烘瀯">
+ <el-input v-model="state.tableQueryParams.procurementAgency" clearable placeholder="璇疯緭鍏ラ噰璐唬鐞嗘満鏋�"/>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+ <el-form-item label="鎶曡瘔浜�">
+ <el-input v-model="state.tableQueryParams.complainant" clearable placeholder="璇疯緭鍏ユ姇璇変汉"/>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+ <el-form-item label="閲囪喘鐩戠潱閮ㄩ棬">
+ <el-input v-model="state.tableQueryParams.procurementSupervisionDepartment" clearable placeholder="璇疯緭鍏ラ噰璐洃鐫i儴闂�"/>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+ <el-form-item label="绾夸笂鍦板潃">
+ <el-input v-model="state.tableQueryParams.url" clearable placeholder="璇疯緭鍏ョ嚎涓婂湴鍧�"/>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
+ <el-form-item >
+ <el-button-group style="display: flex; align-items: center;">
+ <el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'procurementComplaint:page'" v-reclick="1000"> 鏌ヨ </el-button>
+ <el-button icon="ele-Refresh" @click="() => state.tableQueryParams = {}"> 閲嶇疆 </el-button>
+ <el-button icon="ele-ZoomIn" @click="() => state.showAdvanceQueryUI = true" v-if="!state.showAdvanceQueryUI" style="margin-left:5px;"> 楂樼骇鏌ヨ </el-button>
+ <el-button icon="ele-ZoomOut" @click="() => state.showAdvanceQueryUI = false" v-if="state.showAdvanceQueryUI" style="margin-left:5px;"> 闅愯棌 </el-button>
+ <el-button type="danger" style="margin-left:5px;" icon="ele-Delete" @click="batchDelProcurementComplaint" :disabled="state.selectData.length == 0" v-auth="'procurementComplaint:batchDelete'"> 鍒犻櫎 </el-button>
+ <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊')" v-auth="'procurementComplaint:add'"> 鏂板 </el-button>
+ <el-dropdown :show-timeout="70" :hide-timeout="50" @command="exportProcurementComplaintCommand">
+ <el-button type="primary" style="margin-left:5px;" icon="ele-FolderOpened" v-reclick="20000" v-auth="'procurementComplaint:export'"> 瀵煎嚭 </el-button>
+ <template #dropdown>
+ <el-dropdown-menu>
+ <el-dropdown-item command="select" :disabled="state.selectData.length == 0">瀵煎嚭閫変腑</el-dropdown-item>
+ <el-dropdown-item command="current">瀵煎嚭鏈〉</el-dropdown-item>
+ <el-dropdown-item command="all">瀵煎嚭鍏ㄩ儴</el-dropdown-item>
+ </el-dropdown-menu>
+ </template>
+ </el-dropdown>
+ <el-button type="warning" style="margin-left:5px;" icon="ele-MostlyCloudy" @click="importDataRef.openDialog()" v-auth="'procurementComplaint:import'"> 瀵煎叆 </el-button>
+ </el-button-group>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ </el-card>
+ <el-card class="full-table" shadow="hover" style="margin-top: 5px">
+ <el-table :data="state.tableData" @selection-change="(val: any[]) => { state.selectData = val; }" style="width: 100%" v-loading="state.tableLoading" tooltip-effect="light" row-key="id" @sort-change="sortChange" border>
+ <el-table-column type="selection" width="40" align="center" v-if="auth('procurementComplaint:batchDelete') || auth('procurementComplaint:export')" />
+ <el-table-column type="index" label="搴忓彿" width="55" align="center"/>
+ <el-table-column prop='projectCode' label='椤圭洰缂栧彿' show-overflow-tooltip />
+ <el-table-column prop='projectName' label='椤圭洰鍚嶇О' show-overflow-tooltip />
+ <el-table-column prop='decisionDate' label='鍐冲畾鏃ユ湡' show-overflow-tooltip />
+ <el-table-column prop='purchaser' label='閲囪喘浜�' show-overflow-tooltip />
+ <el-table-column prop='procurementAgency' label='閲囪喘浠g悊鏈烘瀯' show-overflow-tooltip />
+ <el-table-column prop='complainant' label='鎶曡瘔浜�' show-overflow-tooltip />
+ <el-table-column prop='procurementSupervisionDepartment' label='閲囪喘鐩戠潱閮ㄩ棬' show-overflow-tooltip />
+ <el-table-column prop='url' label='绾夸笂鍦板潃' show-overflow-tooltip />
+ <el-table-column label="淇敼璁板綍" width="100" align="center" show-overflow-tooltip>
+ <template #default="scope">
+ <ModifyRecord :data="scope.row" />
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="140" align="center" fixed="right" show-overflow-tooltip v-if="auth('procurementComplaint:update') || auth('procurementComplaint:delete')">
+ <template #default="scope">
+ <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊')" v-auth="'procurementComplaint:update'"> 缂栬緫 </el-button>
+ <el-button icon="ele-Delete" size="small" text type="primary" @click="delProcurementComplaint(scope.row)" v-auth="'procurementComplaint:delete'"> 鍒犻櫎 </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ <el-pagination
+ v-model:currentPage="state.tableParams.page"
+ v-model:page-size="state.tableParams.pageSize"
+ @size-change="(val: any) => handleQuery({ pageSize: val })"
+ @current-change="(val: any) => handleQuery({ page: val })"
+ layout="total, sizes, prev, pager, next, jumper"
+ :page-sizes="[10, 20, 50, 100, 200, 500]"
+ :total="state.tableParams.total"
+ size="small"
+ background />
+ <ImportData ref="importDataRef" :import="procurementComplaintApi.importData" :download="procurementComplaintApi.downloadTemplate" v-auth="'procurementComplaint:import'" @refresh="handleQuery"/>
+ <printDialog ref="printDialogRef" :title="'鎵撳嵃鏀垮簻閲囪喘鎶曡瘔鏁版嵁澶勭悊'" @reloadTable="handleQuery" />
+ <editDialog ref="editDialogRef" @reloadTable="handleQuery" />
+ </el-card>
+ </div>
+</template>
+<style scoped>
+:deep(.el-input), :deep(.el-select), :deep(.el-input-number) {
+ width: 100%;
+}
+</style>
\ No newline at end of file
--
Gitblit v1.9.1