Quellcode durchsuchen

1、床垫报价-隐藏报价单内布套相关字段
2、床垫报价-内布套明细厚度字段修改为侧覆
3、床垫报价-修复点击取消失效问题
4、优化定时任务执行,请求日志清理,过期锁清理

MY vor 1 Tag
Ursprung
Commit
77e6a0abf3

+ 2 - 2
JLHHJSvr/DataStore/web_mattress.xml

@@ -211,9 +211,9 @@
 		<field field="biandai_qty" datatype="number">边带数</field>
 		<field field="if_m_chai" datatype="checkbox">面拆</field>
 		<field field="if_n_butao" datatype="checkbox">内布套</field>
-		<field field="s_cover_qty" datatype="number">内布套上覆</field>
+<!-- 		<field field="s_cover_qty" datatype="number">内布套上覆</field>
 		<field field="z_cover_qty" datatype="number">内布套侧覆</field>
-		<field field="x_cover_qty" datatype="number">内布套下覆</field>
+		<field field="x_cover_qty" datatype="number">内布套下覆</field> -->
 		<field field="if_m_wbutao_way" datatype="checkbox">面料外布套做法</field>
 		<field field="s_m_cover_qty" datatype="number">面层向大侧覆盖</field>
 		<field field="z_m_cover_qty" datatype="number">大侧向底层覆盖</field>

+ 9 - 1
JLHHJSvr/Excutor/UnLockTableExcutor.cs

@@ -4,6 +4,7 @@ using System.Linq;
 using JLHHJSvr.BLL;
 using JLHHJSvr.Com;
 using JLHHJSvr.Com.Model;
+using JLHHJSvr.DBA.DBModle;
 using JLHHJSvr.Helper;
 using JLHHJSvr.LJException;
 using LJLib.DAL.SQL;
@@ -22,11 +23,18 @@ namespace JLHHJSvr.Excutor
             {
                 con.Open();
 
+                var user = new u_user_jlhprice() { empid = tokendata.empid };
+                DbSqlHelper.SelectOne(cmd, user, "usermode");
+
+                byte is_admin = 0;
+                if (tokendata.empid == 0) is_admin = 1;
+                else if (user.usermode == 0) is_admin = 1;
+
                 using (cmd.Transaction = con.BeginTransaction())
                 {
                     try
                     {
-                        LockHelper.UnLockBill(cmd, request.keyword, request.billid, tokendata.username,tokendata.empid == 0 ? (byte)1 : (byte)0);
+                        LockHelper.UnLockBill(cmd, request.keyword, request.billid, tokendata.username, is_admin);
                         cmd.Transaction.Commit();
                     }
                     catch (Exception e)

+ 13 - 2
JLHHJSvr/Helper/InterfaceHelper.cs

@@ -34,7 +34,6 @@ namespace JLHHJSvr.Helper
             if (LockHelper.CheckIsLock(cmd, MattressHelper.BillKeyWord, mattress.mattressid, context.tokendata.username, out string arg_msg)) throw new LJCommonException(arg_msg);
             // 检测版本
             CheckBillVersion<u_mattress>(cmd, mattress.mattressid, mattress.version);
-            // 
             mattress.version++;
             DbSqlHelper.Update(cmd, mattress, "erp_mtrlname,erp_mtrltypeid,erp_mtrlmode,erp_mtrltype,erp_mtrlunit,erp_mtrlengname,erp_configcodetype,old_mtrlname,version");
             
@@ -1248,6 +1247,12 @@ namespace JLHHJSvr.Helper
             // 外观
             interfaceList.Add(InserMattressInterfacePz("床垫", "包装方式", 1, new string[] { Enum.GetName(typeof(PackType), mattress.packtype) }));
 
+            if(mattress.packtype.Value == ((int)PackType.卷包))
+            {
+                // 卷包
+                interfaceList.Add(InserMattressInterfacePz("床垫", "卷包方式", 1, new string[] { "" }));
+            }
+
             foreach (var mx in bzList)
             {
                 if (mx.mtrlid > 0 && chastrDict.TryGetValue(mx.formulakind.GetValueOrDefault(), out var chastr))
@@ -1699,7 +1704,7 @@ namespace JLHHJSvr.Helper
                 }
             }
 
-            qdList.Add(InserMattressInterfacePrdPf("垫层", $"{chastr}-床网{count}", namepz, mx.mtrlid.Value, mx.useqty.Value));
+            qdList.Add(InserMattressInterfacePrdPf("垫层", $"{chastr}-床网{count}", namepz, bednetid, mx.useqty.Value));
             // 海绵条*4    2
             qdList.Add(InserMattressInterfacePrdPf("垫层", "海绵条1", ""));
             qdList.Add(InserMattressInterfacePrdPf("垫层", "海绵条2", ""));
@@ -2320,6 +2325,12 @@ namespace JLHHJSvr.Helper
             卷包,
             国内
         }
+        private enum InputType
+        {
+            选择 = 0,
+            录入,
+            带出
+        }
         public static string BillKeyWord = BillNames.MattressInterface;
         #endregion
     }

+ 15 - 1
JLHHJSvr/Helper/LockHelper.cs

@@ -109,6 +109,20 @@ namespace JLHHJSvr.Helper
                 cmd.CommandText = string.Empty;
             }
         }
+        public static void ClearExpireLock(SqlCommand cmd)
+        {
+            try
+            {
+                cmd.CommandText = "DELETE FROM u_lock_table WHERE expire_time < GETDATE()";
+                cmd.CommandType = CommandType.Text;
+                cmd.Parameters.Clear();
+                cmd.ExecuteNonQuery();
+            }
+            catch (Exception ex)
+            {
+                Trace.Write(ex);
+            }
+        }
         /// <summary>
         /// 生成锁提示信息
         /// </summary>
@@ -145,7 +159,7 @@ namespace JLHHJSvr.Helper
                 arg_msg = item.log_msg;
                 return true;
             }
-            return !(item.Code == LockCheckResultCode.Success || item.Code == LockCheckResultCode.LockedBySelf || item.Code == LockCheckResultCode.Expired);
+            return !(item.Code == LockCheckResultCode.Success || item.Code == LockCheckResultCode.LockedBySelf);
         }
         /// <summary>
         /// DFS方式检查单据及依赖链上的锁

+ 6 - 3
JLHHJSvr/LocalLog/LocalTraceListener.cs

@@ -1,4 +1,5 @@
-using LJLib.Tools.File;
+using LJLib.TextLog;
+using LJLib.Tools.File;
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
@@ -16,8 +17,10 @@ namespace LJLib.LocalLog
         private ILogger _logger = null;
         private ILogger _requestLogger = null;
         public bool HasStack { get; set; }
-        public LocalTraceListener(ILogger logger) { _logger = logger; }
-        public LocalTraceListener(ILogger logger, ILogger requestLogger) { _logger = logger; _requestLogger = requestLogger; }
+        public LocalTraceListener(ILogger logger) { 
+            _logger = logger;
+            _requestLogger = new RequestLogger();
+        }
         public override void Write(string message)
         {
             lock (_syncRoot)

+ 5 - 41
JLHHJSvr/TextLog/RequestLogger.cs

@@ -1,5 +1,6 @@
 using LJLib.Tools.File;
 using System;
+using System.Diagnostics;
 using System.IO;
 using System.Threading;
 
@@ -8,17 +9,12 @@ namespace LJLib.TextLog
     internal class RequestLogger : ILogger
     {
         private readonly string _logDir;
-        private Timer _timer;
         private readonly object _syncRoot = new object();
 
-        public RequestLogger(string logDir = null)
+        public RequestLogger()
         {
-            // 默认目录为执行目录下的 log 文件夹
-            _logDir = logDir ?? Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log");
+            _logDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log");
             if (!Directory.Exists(_logDir)) Directory.CreateDirectory(_logDir);
-
-            // 创建定时器:立即启动,每隔24小时执行一次
-            _timer = new Timer(CleanupOldLogs, null, 0, 24 * 60 * 60 * 1000);
         }
 
         /// <summary>
@@ -52,42 +48,10 @@ namespace LJLib.TextLog
                     }
                 }
             }
-            catch
+            catch(Exception ex)
             {
                 // 这里可考虑写到系统事件日志或忽略
-            }
-        }
-
-        /// <summary>
-        /// 清理7天前的日志文件
-        /// </summary>
-        private void CleanupOldLogs(object state)
-        {
-            try
-            {
-                var files = Directory.GetFiles(_logDir, "REQUEST_*.log");
-                DateTime threshold = DateTime.Now.AddDays(-7);
-
-                foreach (var file in files)
-                {
-                    string fileName = Path.GetFileNameWithoutExtension(file);
-                    // 格式: REQUEST_yyyyMMdd
-                    if (fileName.Length == "REQUEST_yyyyMMdd".Length &&
-                        DateTime.TryParseExact(fileName.Replace("REQUEST_", ""),
-                                               "yyyyMMdd",
-                                               null,
-                                               System.Globalization.DateTimeStyles.None,
-                                               out DateTime logDate))
-                    {
-                        if (logDate < threshold.Date)
-                        {
-                            File.Delete(file);
-                        }
-                    }
-                }
-            }
-            catch
-            {
+                Trace.Write(ex);
             }
         }
     }

+ 4 - 1
JLHWEB/src/views/baseinfo/mtrldef/detail.vue

@@ -31,6 +31,8 @@
       </LjVxeTable>
     </template>
   </LjDetail>
+
+  <ErpMtrldefDialog ref="MtrldefDialogRef" v-bind="MtrldefDialogProps" />
 </template>
 
 <script setup lang="tsx" name="mtrldefListDetail">
@@ -42,6 +44,7 @@ import { DetailProp } from "@/components/LjDetail/interface";
 import { useI18n } from "vue-i18n";
 import { useHooks } from "./hooks/index";
 import { useAuthButtons } from "@/hooks/useAuthButtons";
+import ErpMtrldefDialog from "@/views/system/selector/erpMtrlPrice/index.vue";
 
 interface detailProp {
   /**
@@ -65,7 +68,7 @@ interface detailProp {
 
 const props = withDefaults(defineProps<detailProp>(), {});
 const { t } = useI18n();
-const { LjDetailRef, VxeTableMxRef, columns, columns_mx } = useHooks(t);
+const { LjDetailRef, VxeTableMxRef, columns, columns_mx, MtrldefDialogRef, MtrldefDialogProps } = useHooks(t);
 const { CheckPower, CheckOption, buttonNew, buttonDefault } = useAuthButtons(t);
 
 const mainData = ref([{}]);

+ 114 - 7
JLHWEB/src/views/baseinfo/mtrldef/hooks/index.tsx

@@ -1,4 +1,4 @@
-import { ref, reactive, computed, toRefs } from "vue";
+import { ref, reactive, computed, toRefs, nextTick } from "vue";
 import { Table } from "@/hooks/interface";
 import { ColumnProps } from "@/components/LjVxeTable/interface";
 import { ALLOW_EDIT_STATE } from "@/config/index";
@@ -6,6 +6,7 @@ import { SaveMtrlDef, DeleteMtrlDef, BanMtrlDef, getMtrlType } from "@/api/modul
 import { getPriceList } from "@/api/modules/saleprice";
 import { ElMessage, ElMessageBox } from "element-plus";
 import { transformTreeData } from "@/utils/index";
+import ErpMtrlPriceSelect from "@/views/system/selector/erpMtrlPrice/select.vue";
 interface defaultState {
   /**
    * @description 单据当前状态
@@ -32,6 +33,8 @@ interface defaultState {
   priceListFormParams: any;
   priceListVisiable: boolean;
   initParams: any;
+  MtrldefDialogRef: any;
+  MtrldefDialogProps: any;
 }
 
 const state = reactive<defaultState>({
@@ -101,7 +104,9 @@ const state = reactive<defaultState>({
     rate: 1 as number
   },
   priceListVisiable: false,
-  initParams: { mtrltypeids: undefined as Number[] }
+  initParams: { mtrltypeids: undefined as Number[] },
+  MtrldefDialogRef: null,
+  MtrldefDialogProps: {}
 });
 /**
  * @description 表格多选数据操作
@@ -282,35 +287,81 @@ export const useHooks = (t?: any) => {
       field: "erp_mtrlcode",
       title: "L1物料编码",
       basicinfo: {
-        visible: false
+        el: "select",
+        span: 2,
+        editable: ALLOW_EDIT_STATE,
+        render: (scope: any) => {
+          const { column, searchParam: row, status } = scope;
+          let params = {};
+          return (
+            <>
+              <ErpMtrlPriceSelect
+                value={row.erp_mtrlid}
+                {...params}
+                clearable
+                placeholder={row.erp_mtrlcode}
+                onOpenModal={() => fModelChoseMtrl(row, params)}
+                onSelect={(val: any) => rModelSetMtrl(row, val)}
+                onClear={() => rModelClearMtrl(scope.searchParam)}
+              >
+                {{
+                  label: () => row.erp_mtrlcode
+                }}
+              </ErpMtrlPriceSelect>
+            </>
+          );
+        }
       }
     },
     {
       field: "erp_mtrlname",
       title: "L1物料名称",
       basicinfo: {
-        visible: false
+        el: "select",
+        span: 2,
+        editable: ALLOW_EDIT_STATE,
+        render: (scope: any) => {
+          const { column, searchParam: row, status } = scope;
+          let params = {};
+          return (
+            <>
+              <ErpMtrlPriceSelect
+                value={row.erp_mtrlid}
+                {...params}
+                clearable
+                placeholder={row.erp_mtrlname}
+                onOpenModal={() => fModelChoseMtrl(row, params)}
+                onSelect={(val: any) => rModelSetMtrl(row, val)}
+                onClear={() => rModelClearMtrl(scope.searchParam)}
+              >
+                {{
+                  label: () => row.erp_mtrlname
+                }}
+              </ErpMtrlPriceSelect>
+            </>
+          );
+        }
       }
     },
     {
       field: "erp_mtrlmode",
       title: "L1物料规格",
       basicinfo: {
-        visible: false
+        span: 2
       }
     },
     {
       field: "erp_unit",
       title: "L1物料单位",
       basicinfo: {
-        visible: false
+        span: 2
       }
     },
     {
       field: "erp_mtrlengname",
       title: "L1英文名称",
       basicinfo: {
-        visible: false
+        span: 2
       }
     },
     {
@@ -562,6 +613,62 @@ export const useHooks = (t?: any) => {
       });
   };
 
+  /**
+   * @description 弹窗模块:客户选择
+   * @param data 当前数据
+   * @param status 当前订单状态
+   * @returns Promise
+   */
+  const fModelChoseMtrl = (data: any, params: any) => {
+    return new Promise((resolve, reject) => {
+      // if (!ALLOW_EDIT_STATE.includes(status)) return;
+
+      let _params = {
+        keyword: ""
+      };
+      state.MtrldefDialogProps = {
+        onSubmit: (res: any) => {
+          // submit
+          console.log("openCustDialog res", res);
+          nextTick(() => {
+            rModelSetMtrl(data, res.value[0]);
+            resolve(1);
+          });
+        },
+        onCancel: (error: any) => {
+          // cancel 回调
+          console.log("openCustDialog error", error);
+        }
+      };
+      state.MtrldefDialogRef.show(_params);
+    });
+  };
+
+  /**
+   * @description 数据赋值: 联系人
+   * @param data 当前数据
+   * @param item 当前选择的数据
+   */
+  const rModelSetMtrl = (data: any, item: any) => {
+    data.erp_mtrlid = Number(item.mtrlid);
+    data.erp_mtrlname = item.mtrlname;
+    data.erp_mtrlcode = item.mtrlcode;
+    data.erp_mtrlmode = item.mtrlmode;
+    data.erp_unit = item.unit;
+    data.erp_mtrlengname = item.mtrlengname;
+    // data.price = item.price;
+  };
+
+  const rModelClearMtrl = (data: any) => {
+    data.erp_mtrlid = 0;
+    data.erp_mtrlname = "";
+    data.erp_mtrlcode = "";
+    data.erp_mtrlmode = "";
+    data.erp_unit = "";
+    data.erp_mtrlengname = "";
+    // data.price = 0;
+  };
+
   return {
     ...toRefs(state),
     columns,

+ 1 - 1
JLHWEB/src/views/quote/mattressQuote/detail.vue

@@ -2105,7 +2105,7 @@ const orderDefaultAction = [
         //   `/mattressQuote/detail?id=${LjDetailRef.value._mainData.mattressid}&code=${LjDetailRef.value._mainData.mattresscode}`
         // );
         pageRefresh({
-          name: "mattressQuoteEdit",
+          name: "mattressQuoteDetail",
           params: {
             id: LjDetailRef.value._mainData.mattressid,
             code: LjDetailRef.value._mainData.mattresscode

+ 1 - 1
JLHWEB/src/views/quote/mattressQuote/hooks/index.tsx

@@ -4842,7 +4842,7 @@ export const useHooks = (t?: any) => {
       }
     },
     {
-      title: "厚度cm",
+      title: "侧覆cm",
       field: "thickness",
       datatype: "number",
       editRender: {},