From 1d745bcb4acb7ba91c35a086d6244f3fc8c20cda Mon Sep 17 00:00:00 2001
From: 移动系统liao <liaoxujun@qq.com>
Date: 星期四, 19 六月 2025 09:19:43 +0800
Subject: [PATCH] no message

---
 Web/src/views/ADPenalty/aDPenalty/index.vue                                |  174 ++++++++++++
 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyOutput.cs |   79 +++++
 Web/src/api/ADPenalty/aDPenalty.ts                                         |   50 +++
 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyDto.cs    |   79 +++++
 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs  |  179 ++++++++++++
 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs    |  131 +++++++++
 Web/src/views/ADPenalty/aDPenalty/component/editDialog.vue                 |  117 ++++++++
 7 files changed, 809 insertions(+), 0 deletions(-)

diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs
new file mode 100644
index 0000000..b16c340
--- /dev/null
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs
@@ -0,0 +1,131 @@
+锘�// 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.Core;
+using Admin.NET.Application;
+using Furion.DynamicApiController;
+using FZCZTB.NET.MD;
+using Furion.DependencyInjection;
+namespace FZCZTB.TSCL.Application;
+
+/// <summary>
+/// 琛屾斂澶勭綒鏈嶅姟 馃З
+/// </summary>
+[ApiDescriptionSettings(ApplicationConst.GroupName, Order = 100)]
+public class ADPenaltyService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<ADPenalty> _aDPenaltyRep;
+
+    public ADPenaltyService(SqlSugarRepository<ADPenalty> aDPenaltyRep)
+    {
+        _aDPenaltyRep = aDPenaltyRep;
+    }
+
+    /// <summary>
+    /// 鍒嗛〉鏌ヨ琛屾斂澶勭綒 馃敄
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒嗛〉鏌ヨ琛屾斂澶勭綒")]
+    [ApiDescriptionSettings(Name = "Page"), HttpPost]
+    public async Task<SqlSugarPagedList<ADPenaltyOutput>> Page(PageADPenaltyInput input)
+    {
+        input.Keyword = input.Keyword?.Trim();
+        var query = _aDPenaltyRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Parties.Contains(input.Keyword) || u.CaseReason.Contains(input.Keyword) || u.DisposalDecision.Contains(input.Keyword) || u.SupervisionDepartment.Contains(input.Keyword))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Parties), u => u.Parties.Contains(input.Parties.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.CaseReason), u => u.CaseReason.Contains(input.CaseReason.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.DisposalDecision), u => u.DisposalDecision.Contains(input.DisposalDecision.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.SupervisionDepartment), u => u.SupervisionDepartment.Contains(input.SupervisionDepartment.Trim()))
+            .WhereIF(input.DecisionDateRange?.Length == 2, u => u.DecisionDate >= input.DecisionDateRange[0] && u.DecisionDate <= input.DecisionDateRange[1])
+            .Select<ADPenaltyOutput>();
+		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<ADPenalty> Detail([FromQuery] QueryByIdADPenaltyInput input)
+    {
+        return await _aDPenaltyRep.GetFirstAsync(u => u.Id == input.Id);
+    }
+
+    /// <summary>
+    /// 澧炲姞琛屾斂澶勭綒 鉃�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("澧炲姞琛屾斂澶勭綒")]
+    [ApiDescriptionSettings(Name = "Add"), HttpPost]
+    public async Task<bool> Add(AddADPenaltyInput input)
+    {
+        var entity = input.Adapt<ADPenalty>();
+        entity.Id = Guid.NewGuid();
+        return await _aDPenaltyRep.InsertAsync(entity) ;
+    }
+
+    /// <summary>
+    /// 鏇存柊琛屾斂澶勭綒 鉁忥笍
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鏇存柊琛屾斂澶勭綒")]
+    [ApiDescriptionSettings(Name = "Update"), HttpPost]
+    public async Task Update(UpdateADPenaltyInput input)
+    {
+        var entity = input.Adapt<ADPenalty>();
+        await _aDPenaltyRep.AsUpdateable(entity)
+        .IgnoreColumns(u => new {
+            u.Url,
+        })
+        .ExecuteCommandAsync();
+    }
+
+    /// <summary>
+    /// 鍒犻櫎琛屾斂澶勭綒 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒犻櫎琛屾斂澶勭綒")]
+    [ApiDescriptionSettings(Name = "Delete"), HttpPost]
+    public async Task Delete(DeleteADPenaltyInput input)
+    {
+        var entity = await _aDPenaltyRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+        await _aDPenaltyRep.DeleteAsync(entity);   //鍋囧垹闄�
+        //await _aDPenaltyRep.DeleteAsync(entity);   //鐪熷垹闄�
+    }
+
+    /// <summary>
+    /// 鎵归噺鍒犻櫎琛屾斂澶勭綒 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鎵归噺鍒犻櫎琛屾斂澶勭綒")]
+    [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost]
+    public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")]List<DeleteADPenaltyInput> input)
+    {
+        var exp = Expressionable.Create<ADPenalty>();
+        foreach (var row in input) exp = exp.Or(it => it.Id == row.Id);
+        var list = await _aDPenaltyRep.AsQueryable().Where(exp.ToExpression()).ToListAsync();
+   
+        return await _aDPenaltyRep.DeleteAsync(list);   //鍋囧垹闄�
+        //return await _aDPenaltyRep.DeleteAsync(list);   //鐪熷垹闄�
+    }
+}
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyDto.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyDto.cs
new file mode 100644
index 0000000..a12a866
--- /dev/null
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyDto.cs
@@ -0,0 +1,79 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace FZCZTB.TSCL.Application;
+
+/// <summary>
+/// 琛屾斂澶勭綒杈撳嚭鍙傛暟
+/// </summary>
+public class ADPenaltyDto
+{
+    /// <summary>
+    /// id
+    /// </summary>
+    public Guid Id { get; set; }
+    
+    /// <summary>
+    /// 鍐冲畾鏃ユ湡
+    /// </summary>
+    public DateTime DecisionDate { get; set; }
+    
+    /// <summary>
+    /// 褰撲簨浜轰俊鎭�
+    /// </summary>
+    public string? Parties { get; set; }
+    
+    /// <summary>
+    /// 妗堢敱鎻忚堪
+    /// </summary>
+    public string? CaseReason { get; set; }
+    
+    /// <summary>
+    /// 澶勭悊鍐冲畾鍐呭
+    /// </summary>
+    public string? DisposalDecision { get; set; }
+    
+    /// <summary>
+    /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+    /// </summary>
+    public string? SupervisionDepartment { 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 string? Url { get; set; }
+    
+}
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs
new file mode 100644
index 0000000..0a7ffff
--- /dev/null
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs
@@ -0,0 +1,179 @@
+锘�// 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;
+
+namespace FZCZTB.TSCL.Application;
+
+/// <summary>
+/// 琛屾斂澶勭綒鍩虹杈撳叆鍙傛暟
+/// </summary>
+public class ADPenaltyBaseInput
+{
+    /// <summary>
+    /// id
+    /// </summary>
+    public virtual Guid Id { get; set; }
+    
+    /// <summary>
+    /// 鍐冲畾鏃ユ湡
+    /// </summary>
+    [Required(ErrorMessage = "鍐冲畾鏃ユ湡涓嶈兘涓虹┖")]
+    public virtual DateTime DecisionDate { get; set; }
+    
+    /// <summary>
+    /// 褰撲簨浜轰俊鎭�
+    /// </summary>
+    public virtual string? Parties { get; set; }
+    
+    /// <summary>
+    /// 妗堢敱鎻忚堪
+    /// </summary>
+    public virtual string? CaseReason { get; set; }
+    
+    /// <summary>
+    /// 澶勭悊鍐冲畾鍐呭
+    /// </summary>
+    public virtual string? DisposalDecision { get; set; }
+    
+    /// <summary>
+    /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+    /// </summary>
+    public virtual string? SupervisionDepartment { get; set; }
+    
+}
+
+/// <summary>
+/// 琛屾斂澶勭綒鍒嗛〉鏌ヨ杈撳叆鍙傛暟
+/// </summary>
+public class PageADPenaltyInput : BasePageInput
+{
+    /// <summary>
+    /// 鍐冲畾鏃ユ湡鑼冨洿
+    /// </summary>
+     public DateTime?[] DecisionDateRange { get; set; }
+    
+    /// <summary>
+    /// 褰撲簨浜轰俊鎭�
+    /// </summary>
+    public string? Parties { get; set; }
+    
+    /// <summary>
+    /// 妗堢敱鎻忚堪
+    /// </summary>
+    public string? CaseReason { get; set; }
+    
+    /// <summary>
+    /// 澶勭悊鍐冲畾鍐呭
+    /// </summary>
+    public string? DisposalDecision { get; set; }
+    
+    /// <summary>
+    /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+    /// </summary>
+    public string? SupervisionDepartment { get; set; }
+    
+}
+
+/// <summary>
+/// 琛屾斂澶勭綒澧炲姞杈撳叆鍙傛暟
+/// </summary>
+public class AddADPenaltyInput
+{
+    /// <summary>
+    /// 鍐冲畾鏃ユ湡
+    /// </summary>
+    [Required(ErrorMessage = "鍐冲畾鏃ユ湡涓嶈兘涓虹┖")]
+    public DateTime DecisionDate { get; set; }
+    
+    /// <summary>
+    /// 褰撲簨浜轰俊鎭�
+    /// </summary>
+    [MaxLength(255, ErrorMessage = "褰撲簨浜轰俊鎭瓧绗﹂暱搴︿笉鑳借秴杩�255")]
+    public string? Parties { get; set; }
+    
+    /// <summary>
+    /// 妗堢敱鎻忚堪
+    /// </summary>
+    public string? CaseReason { get; set; }
+    
+    /// <summary>
+    /// 澶勭悊鍐冲畾鍐呭
+    /// </summary>
+    public string? DisposalDecision { get; set; }
+    
+    /// <summary>
+    /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+    /// </summary>
+    [MaxLength(255, ErrorMessage = "閲囪喘鐩戠潱閮ㄩ棬鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃255")]
+    public string? SupervisionDepartment { get; set; }
+    
+}
+
+/// <summary>
+/// 琛屾斂澶勭綒鍒犻櫎杈撳叆鍙傛暟
+/// </summary>
+public class DeleteADPenaltyInput
+{
+    /// <summary>
+    /// id
+    /// </summary>
+    [Required(ErrorMessage = "id涓嶈兘涓虹┖")]
+    public Guid Id { get; set; }
+    
+}
+
+/// <summary>
+/// 琛屾斂澶勭綒鏇存柊杈撳叆鍙傛暟
+/// </summary>
+public class UpdateADPenaltyInput
+{
+    /// <summary>
+    /// id
+    /// </summary>    
+    [Required(ErrorMessage = "id涓嶈兘涓虹┖")]
+    public Guid Id { get; set; }
+    
+    /// <summary>
+    /// 鍐冲畾鏃ユ湡
+    /// </summary>    
+    [Required(ErrorMessage = "鍐冲畾鏃ユ湡涓嶈兘涓虹┖")]
+    public DateTime DecisionDate { get; set; }
+    
+    /// <summary>
+    /// 褰撲簨浜轰俊鎭�
+    /// </summary>    
+    [MaxLength(255, ErrorMessage = "褰撲簨浜轰俊鎭瓧绗﹂暱搴︿笉鑳借秴杩�255")]
+    public string? Parties { get; set; }
+    
+    /// <summary>
+    /// 妗堢敱鎻忚堪
+    /// </summary>    
+    public string? CaseReason { get; set; }
+    
+    /// <summary>
+    /// 澶勭悊鍐冲畾鍐呭
+    /// </summary>    
+    public string? DisposalDecision { get; set; }
+    
+    /// <summary>
+    /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+    /// </summary>    
+    [MaxLength(255, ErrorMessage = "閲囪喘鐩戠潱閮ㄩ棬鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃255")]
+    public string? SupervisionDepartment { get; set; }
+    
+}
+
+/// <summary>
+/// 琛屾斂澶勭綒涓婚敭鏌ヨ杈撳叆鍙傛暟
+/// </summary>
+public class QueryByIdADPenaltyInput : DeleteADPenaltyInput
+{
+}
+
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyOutput.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyOutput.cs
new file mode 100644
index 0000000..1f40bb3
--- /dev/null
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyOutput.cs
@@ -0,0 +1,79 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+using Magicodes.ExporterAndImporter.Core;
+namespace FZCZTB.TSCL.Application;
+
+/// <summary>
+/// 琛屾斂澶勭綒杈撳嚭鍙傛暟
+/// </summary>
+public class ADPenaltyOutput
+{
+    /// <summary>
+    /// id
+    /// </summary>
+    public Guid Id { get; set; }    
+    
+    /// <summary>
+    /// 鍐冲畾鏃ユ湡
+    /// </summary>
+    public DateTime DecisionDate { get; set; }    
+    
+    /// <summary>
+    /// 褰撲簨浜轰俊鎭�
+    /// </summary>
+    public string? Parties { get; set; }    
+    
+    /// <summary>
+    /// 妗堢敱鎻忚堪
+    /// </summary>
+    public string? CaseReason { get; set; }    
+    
+    /// <summary>
+    /// 澶勭悊鍐冲畾鍐呭
+    /// </summary>
+    public string? DisposalDecision { get; set; }    
+    
+    /// <summary>
+    /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+    /// </summary>
+    public string? SupervisionDepartment { 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 string? Url { get; set; }    
+    
+}
diff --git a/Web/src/api/ADPenalty/aDPenalty.ts b/Web/src/api/ADPenalty/aDPenalty.ts
new file mode 100644
index 0000000..3a5ca94
--- /dev/null
+++ b/Web/src/api/ADPenalty/aDPenalty.ts
@@ -0,0 +1,50 @@
+锘縤mport {useBaseApi} from '/@/api/base';
+
+// 琛屾斂澶勭綒鎺ュ彛鏈嶅姟
+export const useADPenaltyApi = () => {
+	const baseApi = useBaseApi("aDPenalty");
+	return {
+		// 鍒嗛〉鏌ヨ琛屾斂澶勭綒
+		page: baseApi.page,
+		// 鏌ョ湅琛屾斂澶勭綒璇︾粏
+		detail: baseApi.detail,
+		// 鏂板琛屾斂澶勭綒
+		add: baseApi.add,
+		// 鏇存柊琛屾斂澶勭綒
+		update: baseApi.update,
+		// 鍒犻櫎琛屾斂澶勭綒
+		delete: baseApi.delete,
+		// 鎵归噺鍒犻櫎琛屾斂澶勭綒
+		batchDelete: baseApi.batchDelete,
+	}
+}
+
+// 琛屾斂澶勭綒瀹炰綋
+export interface ADPenalty {
+	// id
+	id: string;
+	// 鍐冲畾鏃ユ湡
+	decisionDate?: string;
+	// 褰撲簨浜轰俊鎭�
+	parties: string;
+	// 妗堢敱鎻忚堪
+	caseReason: string;
+	// 澶勭悊鍐冲畾鍐呭
+	disposalDecision: string;
+	// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+	supervisionDepartment: string;
+	// 鍒涘缓鏃堕棿
+	createTime: string;
+	// 鏇存柊鏃堕棿
+	updateTime: string;
+	// 鍒涘缓鑰匢d
+	createUserId: number;
+	// 鍒涘缓鑰呭鍚�
+	createUserName: string;
+	// 淇敼鑰匢d
+	updateUserId: number;
+	// 淇敼鑰呭鍚�
+	updateUserName: string;
+	// 绾夸笂鍦板潃
+	url: string;
+}
\ No newline at end of file
diff --git a/Web/src/views/ADPenalty/aDPenalty/component/editDialog.vue b/Web/src/views/ADPenalty/aDPenalty/component/editDialog.vue
new file mode 100644
index 0000000..65ffb27
--- /dev/null
+++ b/Web/src/views/ADPenalty/aDPenalty/component/editDialog.vue
@@ -0,0 +1,117 @@
+锘�<script lang="ts" name="aDPenalty" setup>
+import { ref, reactive, onMounted } from "vue";
+import { ElMessage } from "element-plus";
+import type { FormRules } from "element-plus";
+import { formatDate } from '/@/utils/formatTime';
+import { useADPenaltyApi } from '/@/api/ADPenalty/aDPenalty';
+
+//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟
+const emit = defineEmits(["reloadTable"]);
+const aDPenaltyApi = useADPenaltyApi();
+const ruleFormRef = ref();
+
+const state = reactive({
+	title: '',
+	loading: false,
+	showDialog: false,
+	ruleForm: {} as any,
+	stores: {},
+	dropdownData: {} as any,
+});
+
+// 鑷娣诲姞鍏朵粬瑙勫垯
+const rules = ref<FormRules>({
+  decisionDate: [{required: true, message: '璇烽�夋嫨鍐冲畾鏃ユ湡锛�', trigger: 'change',},],
+});
+
+// 椤甸潰鍔犺浇鏃�
+onMounted(async () => {
+});
+
+// 鎵撳紑寮圭獥
+const openDialog = async (row: any, title: string) => {
+	state.title = title;
+	row = row ?? {  };
+	state.ruleForm = row.id ? await aDPenaltyApi.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 aDPenaltyApi[state.ruleForm.id ? 'update' : 'add'](values);
+			closeDialog();
+		} else {
+			ElMessage({
+				message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜,
+				type: "error",
+			});
+		}
+	});
+};
+
+//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠�
+defineExpose({ openDialog });
+</script>
+<template>
+	<div class="aDPenalty-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="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="parties">
+							<el-input v-model="state.ruleForm.parties" placeholder="璇疯緭鍏ュ綋浜嬩汉淇℃伅" maxlength="255" 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="caseReason">
+							<el-input v-model="state.ruleForm.caseReason" placeholder="璇疯緭鍏ユ鐢辨弿杩�" 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="disposalDecision">
+							<el-input v-model="state.ruleForm.disposalDecision" placeholder="璇疯緭鍏ュ鐞嗗喅瀹氬唴瀹�" 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="supervisionDepartment">
+							<el-input v-model="state.ruleForm.supervisionDepartment" placeholder="璇疯緭鍏ラ噰璐洃鐫i儴闂ㄥ悕绉�" 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/ADPenalty/aDPenalty/index.vue b/Web/src/views/ADPenalty/aDPenalty/index.vue
new file mode 100644
index 0000000..756cdaa
--- /dev/null
+++ b/Web/src/views/ADPenalty/aDPenalty/index.vue
@@ -0,0 +1,174 @@
+锘�<script lang="ts" setup name="aDPenalty">
+import { ref, reactive, onMounted } from "vue";
+import { auth } from '/@/utils/authFunction';
+import { ElMessageBox, ElMessage } from "element-plus";
+import { downloadStreamFile } from "/@/utils/download";
+import { useADPenaltyApi } from '/@/api/ADPenalty/aDPenalty';
+import editDialog from '/@/views/ADPenalty/aDPenalty/component/editDialog.vue'
+import printDialog from '/@/views/system/print/component/hiprint/preview.vue'
+import ModifyRecord from '/@/components/table/modifyRecord.vue';
+
+const aDPenaltyApi = useADPenaltyApi();
+const printDialogRef = ref();
+const editDialogRef = 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 aDPenaltyApi.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 delADPenalty = (row: any) => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await aDPenaltyApi.delete({ id: row.id });
+    handleQuery();
+    ElMessage.success("鍒犻櫎鎴愬姛");
+  }).catch(() => {});
+};
+
+// 鎵归噺鍒犻櫎
+const batchDelADPenalty = () => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await aDPenaltyApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => {
+      ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤);
+      handleQuery();
+    });
+  }).catch(() => {});
+};
+
+handleQuery();
+</script>
+<template>
+  <div class="aDPenalty-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-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.parties" 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.caseReason" 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.disposalDecision" 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.supervisionDepartment" clearable placeholder="璇疯緭鍏ラ噰璐洃鐫i儴闂ㄥ悕绉�"/>
+            </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="'aDPenalty: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="batchDelADPenalty" :disabled="state.selectData.length == 0" v-auth="'aDPenalty:batchDelete'"> 鍒犻櫎 </el-button>
+                <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板琛屾斂澶勭綒')" v-auth="'aDPenalty:add'"> 鏂板 </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('aDPenalty:batchDelete') || auth('aDPenalty:export')" />
+        <el-table-column type="index" label="搴忓彿" width="55" align="center"/>
+        <el-table-column prop='decisionDate' label='鍐冲畾鏃ユ湡' show-overflow-tooltip />
+        <el-table-column prop='parties' label='褰撲簨浜轰俊鎭�' show-overflow-tooltip />
+        <el-table-column prop='caseReason' label='妗堢敱鎻忚堪' show-overflow-tooltip />
+        <el-table-column prop='disposalDecision' label='澶勭悊鍐冲畾鍐呭' show-overflow-tooltip />
+        <el-table-column prop='supervisionDepartment' 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('aDPenalty:update') || auth('aDPenalty:delete')">
+          <template #default="scope">
+            <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫琛屾斂澶勭綒')" v-auth="'aDPenalty:update'"> 缂栬緫 </el-button>
+            <el-button icon="ele-Delete" size="small" text type="primary" @click="delADPenalty(scope.row)" v-auth="'aDPenalty: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 />
+      <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