瀏覽代碼

1、优化锁逻辑
2、新增床垫清单辅料生成单数量配置

MY 3 周之前
父節點
當前提交
f697815f15

+ 4 - 0
JLHHJSvr/Com/CheckTableIsLock.cs

@@ -25,6 +25,10 @@ namespace JLHHJSvr.Com
         /// 单据相关id
         /// </summary>
         public int billid { get; set; }
+        /// <summary>
+        /// 单据相关编码
+        /// </summary>
+        public string billcode { get; set; }
     }
 
     public sealed class CheckTableIsLockResponse : LJResponse

+ 17 - 0
JLHHJSvr/Com/Model/BillName.cs

@@ -13,5 +13,22 @@ namespace JLHHJSvr.Com.Model
         public const string SoftBedQuote = nameof(SoftBedQuote);
         public const string MattressInterface = nameof(MattressInterface);
         public const string MattressInterfaceQd = nameof(MattressInterfaceQd);
+
+        public static string GetBillCnName(string keyword)
+        {
+            switch (keyword)
+            {
+                case BillNames.MattressQuote:
+                    return "床垫报价";
+                case BillNames.BedNetQuote:
+                    return "床垫报价";
+                case BillNames.SoftBedQuote:
+                    return "床垫报价";
+                case BillNames.MattressInterface:
+                    return "床垫清单";
+                default:
+                    return "未知单据";
+            }
+        }
     }
 }

+ 5 - 1
JLHHJSvr/Com/Model/u_lock_table.cs

@@ -19,10 +19,14 @@ namespace JLHHJSvr.Com.Model
         /// </summary>
         public string keyword { get; set; }
         /// <summary>
-        /// 被锁定的单据ID
+        /// 被锁定的单据
         /// </summary>
         public int billid { get; set; }
         /// <summary>
+        /// 被锁定的单据
+        /// </summary>
+        public string billcode { get; set; }
+        /// <summary>
         /// 是否锁定(1=锁定,0=未锁定)
         /// </summary>
         public byte is_locked { get; set; }

+ 4 - 0
JLHHJSvr/Com/Model/u_mtrl_price.cs

@@ -103,6 +103,10 @@ namespace JLHHJSvr.Com.Model
         /// </summary>
         public int? if_subspecs { get; set; }
         /// <summary>
+        /// 单数量配置
+        /// </summary>
+        public int is_singleqty { get; set; }
+        /// <summary>
         /// 特殊工艺费用
         /// </summary>
         public decimal? extra_cost { get; set; }

+ 116 - 1
JLHHJSvr/DBA/ParkDBVersion.cs

@@ -30,7 +30,7 @@ namespace JLHHJSvr.DBA
     {
         protected override string currentVersion
         {
-            get { return "1.0.250730"; }
+            get { return "1.0.250921"; }
         }
 
         protected override string dbname
@@ -213,6 +213,121 @@ ALTER TABLE fx_user_dwlayout ADD  CONSTRAINT DF_fx_user_dwlayout_column_detail_h
   new Script("1.0.250730", @"
 ALTER TABLE u_user_jlhprice ADD whiteIPs varchar(2000) NULL
 ", ""),
+        new Script("1.0.250919", @"
+IF NOT EXISTS (SELECT * FROM Sys_scIdentity WHERE tablename = 'u_sys_post' AND columnname = 'postid')
+BEGIN
+    INSERT INTO Sys_scIdentity (scid, tablename, columnname, ScIdentityno)
+    VALUES (0, 'u_sys_post', 'postid', 0);
+END
+
+IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'u_sys_post')
+BEGIN
+    CREATE TABLE u_sys_post (
+        postid int NOT NULL CONSTRAINT DF_u_sys_post_postid DEFAULT 0,
+        scid int NOT NULL CONSTRAINT DF_u_sys_post_scid DEFAULT 0,
+        deptid int NOT NULL CONSTRAINT DF_u_sys_post_deptid DEFAULT 0,
+        empid int NOT NULL CONSTRAINT DF_u_sys_post_empid DEFAULT 0,
+        type int NOT NULL CONSTRAINT DF_u_sys_post_type DEFAULT 0,
+        empids char(1024) NOT NULL CONSTRAINT DF_u_sys_post_empids DEFAULT '',
+        sdate datetime NULL,
+        edate datetime NULL,
+        dscrp varchar(4000) NOT NULL CONSTRAINT DF_u_sys_post_dscrp DEFAULT '',
+        opemp char(20) NOT NULL CONSTRAINT DF_u_sys_post_opemp DEFAULT '',
+        opdate datetime NULL,
+        level int NOT NULL CONSTRAINT DF_u_sys_post_level DEFAULT 0,
+        CONSTRAINT UK_u_sys_post PRIMARY KEY (postid)
+    );
+END
+", ""),
+    new Script("1.0.250919", @"
+IF NOT EXISTS (SELECT * FROM sys_func_pwr WHERE funcid = 161)
+BEGIN
+    INSERT INTO sys_func_pwr (funcid, parentid, treename, menuname, if_use)
+    VALUES
+    (161, 109, '单据解锁', '单据解锁', 1),
+    (162, 161, '单据解锁','解锁', 1);
+END
+
+IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'u_lock_table')
+BEGIN
+    CREATE TABLE u_lock_table (
+        logid int IDENTITY(1,1) NOT NULL,
+        keyword VARCHAR(24) NOT NULL CONSTRAINT DF_u_lock_table_keyword DEFAULT(''),
+        billid INT NOT NULL CONSTRAINT DF_u_lock_table_billid DEFAULT(0),
+        billcode VARCHAR(50) NOT NULL CONSTRAINT DF_u_lock_table_billcode DEFAULT(''),
+        is_locked BIT NOT NULL CONSTRAINT DF_u_lock_table_is_locked DEFAULT(1),
+        opemp VARCHAR(24) NOT NULL CONSTRAINT DF_u_lock_table_opemp DEFAULT(''),
+        lock_time DATETIME NOT NULL CONSTRAINT DF_u_lock_table_lock_time DEFAULT(GETDATE()),
+        expire_time DATETIME NULL CONSTRAINT DF_u_lock_table_expire_time DEFAULT(NULL),
+        CONSTRAINT UK_u_lock_table PRIMARY KEY (logid),
+        CONSTRAINT UQ_u_lock_table UNIQUE (keyword, billid)
+    );
+END
+
+IF NOT EXISTS (SELECT * FROM sys.procedures WHERE name = 'sp_lock_record')
+BEGIN
+    EXEC('
+    CREATE PROCEDURE sp_lock_record
+        @keyword VARCHAR(24),
+        @billid INT,
+        @billcode VARCHAR(50),
+        @opemp VARCHAR(24),
+        @lockMinutes INT = 30
+    AS
+    BEGIN
+        SET NOCOUNT ON;
+        DECLARE @now DATETIME = GETDATE();
+        DECLARE @expire DATETIME = DATEADD(MINUTE, @lockMinutes, @now);
+
+        DELETE FROM u_lock_table
+        WHERE keyword = @keyword AND billid = @billid
+          AND expire_time IS NOT NULL AND expire_time < @now;
+
+        BEGIN TRY
+            INSERT INTO u_lock_table (keyword, billid, billcode, is_locked, opemp, lock_time, expire_time)
+            VALUES (@keyword, @billid, @billcode, 1, @opemp, @now, @expire);
+            SELECT 1 AS arg_rslt, ''加锁成功'' AS arg_msg;
+        END TRY
+        BEGIN CATCH
+            SELECT 0 AS arg_rslt, ''当前单据已被锁定,不能编辑'' AS arg_msg;
+        END CATCH
+    END;
+    ');
+END
+
+IF NOT EXISTS (SELECT * FROM sys.procedures WHERE name = 'sp_unlock_record')
+BEGIN
+    EXEC('
+    CREATE PROCEDURE sp_unlock_record
+        @keyword VARCHAR(24),
+        @billid INT,
+        @opemp VARCHAR(24),
+        @is_admin BIT = 0
+    AS
+    BEGIN
+        SET NOCOUNT ON;
+        
+        IF @is_admin = 1
+            DELETE FROM u_lock_table
+            WHERE keyword = @keyword AND billid = @billid;
+        ELSE
+            DELETE FROM u_lock_table
+            WHERE keyword = @keyword AND billid = @billid
+              AND opemp = @opemp;
+        
+        IF @@ROWCOUNT > 0
+            SELECT 1 AS arg_rslt, ''解锁成功'' AS arg_msg;
+        ELSE
+            SELECT 0 AS arg_rslt, 
+                   CASE 
+                       WHEN @is_admin = 1 THEN ''解锁失败,记录不存在或已过期''
+                       ELSE ''解锁失败,原因:可能不是本人加的锁或已过期''
+                   END AS arg_msg;
+    END;
+    ');
+END
+", ""),
+  new Script("1.0.250919", @"ALTER TABLE u_mtrl_price ADD is_singleqty BIT NOT NULL CONSTRAINT DF_u_lock_table_is_singleqty DEFAULT(0)", ""),
                 };
             }
         }

+ 2 - 2
JLHHJSvr/Excutor/CheckTableIsLockExcutor.cs

@@ -40,9 +40,9 @@ namespace JLHHJSvr.Excutor
                     var lockItem = LockHelper.CheckLockAll(cmd, request.keyword, request.billid,tokendata.username);
 
                     if (lockItem.Code == LockCheckResultCode.LockedByOther) throw new LJCommonException(lockItem.log_msg);
-                    if(lockItem.Code == LockCheckResultCode.Success)
+                    if(lockItem.Code == LockCheckResultCode.Success || lockItem.Code == LockCheckResultCode.Expired)
                     {
-                        LockHelper.LockBill(cmd,request.keyword,request.billid,tokendata.username);
+                        LockHelper.LockBill(cmd,request.keyword,request.billid,request.billcode,tokendata.username);
                     }
                 }catch(Exception ex)
                 {

+ 2 - 1
JLHHJSvr/Excutor/GetMtrlDefListExcutor.cs

@@ -55,6 +55,7 @@ namespace JLHHJSvr.Excutor
 		                            ,u_mtrl_price_pricelist.pricelistid
                                     ,u_mtrl_price.if_subspecs
                                     ,u_mtrl_price.extra_cost
+                                    ,u_mtrl_price.is_singleqty
 	                            FROM u_mtrl_price
 	                            INNER JOIN u_mtrl_price_pricelist ON u_mtrl_price.mtrlid = u_mtrl_price_pricelist.mtrlid";
                 var list = new List<u_mtrl_price>();
@@ -78,7 +79,7 @@ namespace JLHHJSvr.Excutor
                     parms.Add("@keyword", "%" + request.keyword + "%");
                 }
 
-                var outputFields = "mtrlid,mtrltype,name,priceunit,shrinkage,gram_weight,cloth_width,if_inputqty,if_areaprice,createtime,createby,price,thickness,dscrp,erp_mtrlid,fjcnt,isuse,lastdate,handtype,pricelistid,if_subspecs,extra_cost";
+                var outputFields = "mtrlid,mtrltype,name,priceunit,shrinkage,gram_weight,cloth_width,if_inputqty,if_areaprice,createtime,createby,price,thickness,dscrp,erp_mtrlid,fjcnt,isuse,lastdate,handtype,pricelistid,if_subspecs,extra_cost,is_singleqty";
                 DbSqlHelper.SelectJoin(cmd, selectStr, ListEx.GetWhereStr(whereList), parms, "mtrlid", outputFields, request.pageNum, request.pageSize, list);
 
                 // 

+ 1 - 1
JLHHJSvr/Excutor/LockTableExcutor.cs

@@ -40,7 +40,7 @@ namespace JLHHJSvr.Excutor
                     {
                         foreach(var bill in request.lockList)
                         {
-                            LockHelper.LockBill(cmd, bill.keyword, bill.billid, tokendata.username);
+                            LockHelper.LockBill(cmd, bill.keyword, bill.billid, bill.billcode,tokendata.username);
                         }
 
                         cmd.Transaction.Commit();

+ 2 - 2
JLHHJSvr/Excutor/SaveMtrlDefExcutor.cs

@@ -56,7 +56,7 @@ namespace JLHHJSvr.Excutor
                             request.mtrl.createtime = dtNow;
                             request.mtrl.createby = tokendata.username;
 
-                            var fields = @"mtrlid,mtrltype,name,priceunit,shrinkage,gram_weight,cloth_width,if_inputqty,if_areaprice,createtime,createby,thickness,dscrp,erp_mtrlid,fjcnt,isuse,handtype,lastdate,erp_mtrlengname,if_subspecs,extra_cost";
+                            var fields = @"mtrlid,mtrltype,name,priceunit,shrinkage,gram_weight,cloth_width,if_inputqty,if_areaprice,createtime,createby,thickness,dscrp,erp_mtrlid,fjcnt,isuse,handtype,lastdate,erp_mtrlengname,if_subspecs,extra_cost,is_singleqty";
                             DbSqlHelper.Insert(cmd, "u_mtrl_price", null, request.mtrl, fields);
 
                             var fields2 = @"mtrlid,pricelistid,price,pricetype,price_formula,qty_formula";
@@ -75,7 +75,7 @@ namespace JLHHJSvr.Excutor
                         else
                         {
                             //修改
-                            var fields = @"mtrltype,name,priceunit,shrinkage,gram_weight,cloth_width,if_inputqty,if_areaprice,thickness,dscrp,erp_mtrlid,fjcnt,isuse,handtype,lastdate,erp_mtrlengname,if_subspecs,extra_cost";
+                            var fields = @"mtrltype,name,priceunit,shrinkage,gram_weight,cloth_width,if_inputqty,if_areaprice,thickness,dscrp,erp_mtrlid,fjcnt,isuse,handtype,lastdate,erp_mtrlengname,if_subspecs,extra_cost,is_singleqty";
                             DbSqlHelper.Update(cmd, "u_mtrl_price", null, request.mtrl, "mtrlid", fields);
 
                             var fields2 = @"price,pricetype,price_formula,qty_formula";

+ 11 - 0
JLHHJSvr/Helper/CacheHelper.cs

@@ -6,6 +6,7 @@ using LJLib.DAL.SQL;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
+using System.Configuration;
 using System.Data.SqlClient;
 using System.Linq;
 using System.Reflection;
@@ -38,6 +39,16 @@ namespace JLHHJSvr.Helper
                 return instance;
             }
         }
+
+        public class MtrlMapping : ICacheMapping<int, u_mtrl_price>
+        {
+            public u_mtrl_price GetInstance(SqlCommand cmd, int mtrlid)
+            {
+                var instance = new u_mtrl_price() { mtrlid = mtrlid };
+                DbSqlHelper.SelectOne(cmd, instance, "mtrlid,mtrltype,name,priceunit,shrinkage,gram_weight,cloth_width,if_inputqty,if_areaprice,createtime,createby,thickness,dscrp,erp_mtrlid,fjcnt,isuse,lastdate,handtype,if_subspecs,extra_cost,is_singleqty");
+                return instance;
+            }
+        }
         #endregion
 
         #region 获取数据

+ 4 - 6
JLHHJSvr/Helper/InterfaceHelper.cs

@@ -10,6 +10,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
+using static JLHHJSvr.Helper.CacheHelper;
 
 namespace JLHHJSvr.Helper
 {
@@ -1181,13 +1182,10 @@ namespace JLHHJSvr.Helper
                 {
                     int cnt = Convert.ToInt32(Math.Abs(mx.qty.Value));
 
-                    var mtrldef = new u_mtrl_price() { mtrlid = mx.mtrlid };
-                    if (DbSqlHelper.SelectOne(cmd, mtrldef, "erp_mtrlid") == 1)
-                    {
-                        mx.erp_mtrlid = mtrldef.erp_mtrlid;
-                    }
+                    var mtrldef = Cache.GetData<u_mtrl_price, MtrlMapping>(mx.mtrlid.Value);
+                    if(mtrldef != null) mx.erp_mtrlid = mtrldef.erp_mtrlid;
                     // 处理特殊辅料
-                    if (specialSet.Any(x => mx.mtrlname.Contains(x)))
+                    if (specialSet.Any(x => mx.mtrlname.Contains(x)) || mtrldef.is_singleqty == 1)
                     {
                         interfaceList.Add(InserMattressInterfacePz("辅料", $"{mx.mtrlname}", 1, new string[] { $"{cnt.ToString("#,##0.0#")}个" }));
                         continue; // 跳过后续的处理

+ 12 - 30
JLHHJSvr/Helper/LockHelper.cs

@@ -22,9 +22,9 @@ namespace JLHHJSvr.Helper
         /// </summary>
         /// <param name="keyword"></param>
         /// <param name="billid"></param>
-        public static void LockBill(SqlCommand cmd, string keyword, int billid, string opemp, int lockMinutes = 30)
+        public static void LockBill(SqlCommand cmd, string keyword, int billid, string billcode,string opemp, int lockMinutes = 30)
         {
-            return;
+            //return;
             try
             {
                 cmd.CommandText = "sp_lock_record";
@@ -32,6 +32,7 @@ namespace JLHHJSvr.Helper
                 cmd.Parameters.Clear();
                 cmd.Parameters.AddWithValue("@keyword", keyword);
                 cmd.Parameters.AddWithValue("@billid", billid);
+                cmd.Parameters.AddWithValue("@billcode", billcode);
                 cmd.Parameters.AddWithValue("@opemp", opemp);
                 cmd.Parameters.AddWithValue("@lockMinutes", lockMinutes);
                 using (var reader = cmd.ExecuteReader())
@@ -41,7 +42,7 @@ namespace JLHHJSvr.Helper
                         var arg_rslt = Convert.ToInt32(reader["arg_rslt"]);
                         var arg_msg = Convert.ToString(reader["arg_msg"]);
 
-                        if (arg_rslt != 1) throw new LJCommonException(arg_msg);
+                        //if (arg_rslt != 1) throw new LJCommonException(arg_msg);
                     }
                 }
             }
@@ -59,7 +60,7 @@ namespace JLHHJSvr.Helper
         /// <param name="billid"></param>
         public static void UnLockBill(SqlCommand cmd, string keyword, int billid, string opemp, byte is_admin)
         {
-            return;
+            //return;
             try
             {
                 cmd.CommandText = "sp_unlock_record";
@@ -89,29 +90,10 @@ namespace JLHHJSvr.Helper
         /// <summary>
         /// 生成锁提示信息
         /// </summary>
-        private static string GetLockMessage(SqlCommand cmd, string keyword, int billid, string opEmp)
+        private static string GetLockMessage(SqlCommand cmd, string keyword, string billcode, string opEmp)
         {
-            if (BillNames.MattressQuote.Equals(keyword))
-            {
-                var mattress = GetHelper<MattressHelper>(cmd).GetMattress(billid, "mattresscode");
-                return $"床垫报价【{mattress.mattresscode}】被用户【{opEmp}】编辑中。";
-            }
-            if (BillNames.MattressInterface.Equals(keyword))
-            {
-                var mattress = GetHelper<MattressHelper>(cmd).GetMattress(billid, "mattresscode");
-                return $"床垫清单【{mattress.mattresscode}】被用户【{opEmp}】编辑中。";
-            }
-            if (BillNames.BedNetQuote.Equals(keyword))
-            {
-                var bednet = GetHelper<BedNetHelper>(cmd).GetBedNet(billid, "bednetcode");
-                return $"床网报价【{bednet.bednetcode}】被用户【{opEmp}】编辑中。";
-            }
-            if (BillNames.SoftBedQuote.Equals(keyword))
-            {
-                var softbed = GetHelper<SoftBedHelper>(cmd).GetSoftBed(billid, "softbed_code");
-                return $"软床报价【{softbed.softbed_code}】正在被用户【{opEmp}】编辑中。";
-            }
-            return $"单据【{keyword}-{billid}】被用户【{opEmp}】编辑中。";
+            string billName = BillNames.GetBillCnName(keyword);
+            return $"{billName}【{billcode}】被用户【{opEmp}】编辑中。";
         }
         #region
         /// <summary>
@@ -134,7 +116,7 @@ namespace JLHHJSvr.Helper
         public static bool CheckIsLock(SqlCommand cmd, string keyword, int billid, string opemp,out string arg_msg)
         {
             arg_msg = string.Empty;
-            return false;
+            //return false;
             var item = CheckLockAll(cmd, keyword, billid, opemp);
             if (item.Code == LockCheckResultCode.LockedByOther)
             {
@@ -160,12 +142,13 @@ namespace JLHHJSvr.Helper
             var mainLock = new u_lock_table { keyword = keyword, billid = billid };
             DbSqlHelper.SelectOne(cmd,"u_lock_table","keyword = @keyword AND billid = @billid AND is_locked = 1",
                 new Dictionary<string, object> { { "@keyword", keyword }, { "@billid", billid } },
-                mainLock, "keyword,billid,opemp,is_locked,lock_time,expire_time");
+                mainLock, "keyword,billid,billcode,opemp,is_locked,lock_time,expire_time");
 
+            if (mainLock.expire_time < DateTime.Now) mainLock.Code = LockCheckResultCode.Expired;
             if (mainLock.is_locked == 1)
             {
                 mainLock.Code = mainLock.opemp.Equals(opemp) ? LockCheckResultCode.LockedBySelf : LockCheckResultCode.LockedByOther;
-                mainLock.log_msg = GetLockMessage(cmd, keyword, billid, mainLock.opemp);
+                mainLock.log_msg = GetLockMessage(cmd, keyword, mainLock.billcode, mainLock.opemp);
                 return mainLock;
             }
             visited[key] = 2; // 标记完成
@@ -216,7 +199,6 @@ namespace JLHHJSvr.Helper
 
             return dependencies;
         }
-
         #endregion
     }
 }

+ 20 - 0
JLHWEB/src/views/baseinfo/mtrldef/hooks/index.tsx

@@ -414,6 +414,26 @@ export const useHooks = (t?: any) => {
         span: 2,
         editable: ALLOW_EDIT_STATE
       }
+    },
+    {
+      field: "is_singleqty",
+      title: "单数量配置",
+      datatype: "checkbox",
+      basicinfo: {
+        editable: ALLOW_EDIT_STATE,
+        span: 2,
+        render: (scope: any) => {
+          const { column, searchParam } = scope;
+
+          return (
+            <>
+              <div class="flx-align-center">
+                <el-checkbox v-model={searchParam[column.field]} true-label={1} false-value={0} />
+              </div>
+            </>
+          );
+        }
+      }
     }
   ];