Commit e44fd8936a390c2860aafc8149be30aaf0ffaa22

Authored by “wangming”
1 parent db9c79c0

feat: update project configuration and enhance salary calculation logic

- Added new settings in project.config.json for improved build options.
- Enhanced salary calculation services to include conditions for user eligibility based on entry and leave dates across multiple service files.
- Updated various UI components to improve user experience and added new options in member source selections.
Showing 20 changed files with 112 additions and 35 deletions
member-miniapp/unpackage/dist/dev/mp-weixin/project.config.json
1 1 {
2 2 "description": "项目配置文件。",
3 3 "packOptions": {
4   - "ignore": []
  4 + "ignore": [],
  5 + "include": []
5 6 },
6 7 "setting": {
7 8 "urlCheck": false,
... ... @@ -9,11 +10,30 @@
9 10 "postcss": true,
10 11 "minified": true,
11 12 "newFeature": true,
12   - "bigPackageSizeSupport": true
  13 + "bigPackageSizeSupport": true,
  14 + "compileWorklet": false,
  15 + "uglifyFileName": false,
  16 + "uploadWithSourceMap": true,
  17 + "enhance": false,
  18 + "packNpmManually": false,
  19 + "packNpmRelationList": [],
  20 + "minifyWXSS": true,
  21 + "minifyWXML": true,
  22 + "localPlugins": false,
  23 + "disableUseStrict": false,
  24 + "useCompilerPlugins": false,
  25 + "condition": false,
  26 + "swc": false,
  27 + "disableSWC": true,
  28 + "babelSetting": {
  29 + "ignore": [],
  30 + "disablePlugins": [],
  31 + "outputPath": ""
  32 + }
13 33 },
14 34 "compileType": "miniprogram",
15 35 "libVersion": "",
16   - "appid": "touristappid",
  36 + "appid": "wx5f4fc45cc3bbf5f8",
17 37 "projectname": "绿纤美业会员端",
18 38 "condition": {
19 39 "search": {
... ... @@ -32,5 +52,7 @@
32 52 "current": -1,
33 53 "list": []
34 54 }
35   - }
  55 + },
  56 + "simulatorPluginLibVersion": {},
  57 + "editorSetting": {}
36 58 }
37 59 \ No newline at end of file
... ...
member-miniapp/unpackage/dist/dev/mp-weixin/project.private.config.json 0 → 100644
  1 +{
  2 + "libVersion": "3.15.1",
  3 + "projectname": "mp-weixin",
  4 + "condition": {},
  5 + "setting": {
  6 + "urlCheck": false,
  7 + "coverView": false,
  8 + "lazyloadPlaceholderEnable": false,
  9 + "skylineRenderEnable": false,
  10 + "preloadBackgroundData": false,
  11 + "autoAudits": false,
  12 + "useApiHook": true,
  13 + "showShadowRootInWxmlPanel": false,
  14 + "useStaticServer": false,
  15 + "useLanDebug": false,
  16 + "showES6CompileOption": false,
  17 + "compileHotReLoad": true,
  18 + "checkInvalidKey": true,
  19 + "ignoreDevUnusedFiles": true,
  20 + "bigPackageSizeSupport": true
  21 + }
  22 +}
0 23 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqAssistantSalaryService.cs
... ... @@ -211,7 +211,8 @@ namespace NCC.Extend
211 211 var monthFactUserIdSet = (await LqMonthlyEmployeeFactHelper.GetUserIdsWithMonthBusinessFactsAsync(_db, year, month))
212 212 .ToHashSet(StringComparer.Ordinal);
213 213 var assistantUserEntities = await _db.Queryable<UserEntity>()
214   - .Where(x => x.DeleteMark == null && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)))
  214 + .Where(x => x.DeleteMark == null && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)
  215 + || (x.EntryDate != null && x.EntryDate <= endDate && (x.LeaveDate == null || x.LeaveDate >= startDate))))
215 216 .Where(x => (x.Gw == "店助" || x.Gw == "店助主任") || extraIds.Contains(x.Id))
216 217 .ToListAsync();
217 218 await LqSalaryUserSnapshotHelper.ApplySalaryUserSnapshotsAsync(_db, assistantUserEntities, endDate);
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqDirectorSalaryService.cs
... ... @@ -266,8 +266,10 @@ namespace NCC.Extend
266 266 var extraIds = await LqSalaryUserSnapshotHelper.GetSalaryCandidateUserIdsAsync(_db, startDate, endDate, year, month);
267 267 var monthFactUserIdSet = (await LqMonthlyEmployeeFactHelper.GetUserIdsWithMonthBusinessFactsAsync(_db, year, month))
268 268 .ToHashSet(StringComparer.Ordinal);
  269 + // 当月曾在职:入职不晚于月末且(未离职或离职不早于月初);须内联日期条件,勿调用静态方法(SqlSugar 无法翻译)
269 270 var directorUserEntities = await _db.Queryable<UserEntity>()
270   - .Where(x => x.DeleteMark == null && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)))
  271 + .Where(x => x.DeleteMark == null && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)
  272 + || (x.EntryDate != null && x.EntryDate <= endDate && (x.LeaveDate == null || x.LeaveDate >= startDate))))
271 273 .Where(x => x.Gw == "主任" || extraIds.Contains(x.Id))
272 274 .ToListAsync();
273 275 await LqSalaryUserSnapshotHelper.ApplySalaryUserSnapshotsAsync(_db, directorUserEntities, endDate);
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqMajorProjectDirectorSalaryService.cs
... ... @@ -231,7 +231,8 @@ namespace NCC.Extend
231 231 var monthFactUserIdSet = (await LqMonthlyEmployeeFactHelper.GetUserIdsWithMonthBusinessFactsAsync(_db, year, month))
232 232 .ToHashSet(StringComparer.Ordinal);
233 233 var directorEntities = await _db.Queryable<UserEntity>()
234   - .Where(x => x.DeleteMark == null && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)))
  234 + .Where(x => x.DeleteMark == null && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)
  235 + || (x.EntryDate != null && x.EntryDate <= endDate && (x.LeaveDate == null || x.LeaveDate >= startDate))))
235 236 .Where(x =>
236 237 (x.Gw == "主管" && majorProjectOrganizeIds.Contains(x.OrganizeId))
237 238 || extraIds.Contains(x.Id))
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqSalaryExtraCalculationService.cs
... ... @@ -565,7 +565,8 @@ namespace NCC.Extend
565 565 // 健康师的岗位字段是F_GW,值为"健康师"
566 566 var healthCoaches = await _db.Queryable<UserEntity>()
567 567 .Where(u => newStoreIds.Contains(u.Mdid) && u.Gw == "健康师" && (u.DeleteMark == null || u.DeleteMark == 0)
568   - && (u.EnabledMark == 1 || monthFactUserIdSet.Contains(u.Id)))
  568 + && (u.EnabledMark == 1 || monthFactUserIdSet.Contains(u.Id)
  569 + || (u.EntryDate != null && u.EntryDate <= endDate && (u.LeaveDate == null || u.LeaveDate >= startDate))))
569 570 .Select(u => new { u.Id, u.RealName, u.Mdid })
570 571 .ToListAsync();
571 572  
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqSalaryService.cs
... ... @@ -468,7 +468,8 @@ namespace NCC.Extend
468 468 .ToHashSet(StringComparer.Ordinal);
469 469 var userEntities = await _db.Queryable<UserEntity>()
470 470 .Where(x => candidateIds.Contains(x.Id) && x.DeleteMark == null
471   - && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)))
  471 + && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)
  472 + || (x.EntryDate != null && x.EntryDate <= endDate && (x.LeaveDate == null || x.LeaveDate >= startDate))))
472 473 .ToListAsync();
473 474 await LqSalaryUserSnapshotHelper.ApplySalaryUserSnapshotsAsync(_db, userEntities, endDate);
474 475 var userList = userEntities
... ... @@ -485,8 +486,8 @@ namespace NCC.Extend
485 486 var positionList = await _db.Queryable<PositionEntity>().Where(x => positionIds.Contains(x.Id)).ToListAsync();
486 487 var positionLookup = positionList.Where(x => !string.IsNullOrEmpty(x.Id)).ToDictionary(x => x.Id, x => x.FullName);
487 488  
488   - // 只处理健康师员工
489   - foreach (var empId in allEmployeeIds.Where(x => healthCoachIds.Contains(x)))
  489 + // 只处理健康师:含仅有当月考勤/切段、无业绩消耗战队的候选人(与 candidateIds 扩大口径一致)
  490 + foreach (var empId in healthCoachIds.Distinct())
490 491 {
491 492 var salary = new LqSalaryStatisticsEntity
492 493 {
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqStoreManagerSalaryService.cs
... ... @@ -223,7 +223,8 @@ namespace NCC.Extend
223 223 var monthFactUserIdSet = (await LqMonthlyEmployeeFactHelper.GetUserIdsWithMonthBusinessFactsAsync(_db, year, month))
224 224 .ToHashSet(StringComparer.Ordinal);
225 225 var storeManagerUserEntities = await _db.Queryable<UserEntity>()
226   - .Where(x => x.DeleteMark == null && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)))
  226 + .Where(x => x.DeleteMark == null && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)
  227 + || (x.EntryDate != null && x.EntryDate <= endDate && (x.LeaveDate == null || x.LeaveDate >= startDate))))
227 228 .Where(x => x.Gw == "店长" || extraIds.Contains(x.Id))
228 229 .ToListAsync();
229 230 await LqSalaryUserSnapshotHelper.ApplySalaryUserSnapshotsAsync(_db, storeManagerUserEntities, endDate);
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqTechGeneralManagerSalaryService.cs
... ... @@ -262,7 +262,8 @@ namespace NCC.Extend
262 262 var monthFactUserIdSet = (await LqMonthlyEmployeeFactHelper.GetUserIdsWithMonthBusinessFactsAsync(_db, year, month))
263 263 .ToHashSet(StringComparer.Ordinal);
264 264 var gmEntities = await _db.Queryable<UserEntity>()
265   - .Where(x => x.DeleteMark == null && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)))
  265 + .Where(x => x.DeleteMark == null && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)
  266 + || (x.EntryDate != null && x.EntryDate <= endDate && (x.LeaveDate == null || x.LeaveDate >= startDate))))
266 267 .Where(x =>
267 268 ((x.Gw == "总经理" || x.Gw == "科技部总经理") && techOrganizeIds.Contains(x.OrganizeId))
268 269 || extraIds.Contains(x.Id))
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqTechTeacherSalaryService.cs
... ... @@ -253,7 +253,8 @@ namespace NCC.Extend
253 253 var monthFactUserIdSet = (await LqMonthlyEmployeeFactHelper.GetUserIdsWithMonthBusinessFactsAsync(_db, year, month))
254 254 .ToHashSet(StringComparer.Ordinal);
255 255 var techTeacherUserEntities = await _db.Queryable<UserEntity>()
256   - .Where(x => x.DeleteMark == null && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)))
  256 + .Where(x => x.DeleteMark == null && (x.EnabledMark == 1 || monthFactUserIdSet.Contains(x.Id)
  257 + || (x.EntryDate != null && x.EntryDate <= endDate && (x.LeaveDate == null || x.LeaveDate >= startDate))))
257 258 .Where(x => x.Gw == "科技老师" || extraIds.Contains(x.Id))
258 259 .ToListAsync();
259 260 await LqSalaryUserSnapshotHelper.ApplySalaryUserSnapshotsAsync(_db, techTeacherUserEntities, endDate);
... ...
绿纤uni-app/common/config.js
... ... @@ -12,8 +12,8 @@ const ENV_CONFIG = {
12 12 production: {
13 13 name: '正式环境',
14 14 // apiBaseUrl: 'http://erp_test.lvqianmeiye.com',
15   - // apiBaseUrl: 'http://localhost:2015',
16   - apiBaseUrl: 'https://erp.lvqianmeiye.com',
  15 + apiBaseUrl: 'http://localhost:2015',
  16 + // apiBaseUrl: 'https://erp.lvqianmeiye.com',
17 17 // apiBaseUrl: 'http://lvqian.antissoft.com',
18 18 description: '生产环境服务器'
19 19 }
... ...
绿纤uni-app/unpackage/dist/dev/mp-weixin/pages/attendance-punch/attendance-punch.js
... ... @@ -469,7 +469,7 @@ var _default = {
469 469 if (!rf && !rw) return '当前门店未要求范围或 Wi-Fi,正常打卡可直接进行';
470 470 var fenceLine = rf ? this.longitude == null || this.latitude == null ? '需定位后判断是否在打卡范围内' : this.isInFence === true ? '已在打卡范围内' : '不在打卡范围内' : '';
471 471 var hasPairs = this.wifiPairRulesCount > 0;
472   - var wifiLine = rw ? !hasPairs ? '门店已要求 Wi-Fi 打卡,但未配置网络白名单,请联系管理员在门店资料中维护' : this.wifiMatchesStore ? '已匹配门店 Wi-Fi 规则' : '未匹配门店 Wi-Fi 规则(开启「对应」且无 BSSID 时需同时在围栏内且 SSID 正确)' : '';
  472 + var wifiLine = rw ? !hasPairs ? '门店已要求 Wi-Fi 打卡,但未配置网络白名单,请联系管理员在门店资料中维护' : this.wifiMatchesStore ? '已匹配门店 Wi-Fi 规则' : '未匹配门店 Wi-Fi 规则(严格:有 BSSID 仅校验路由器;无 BSSID 且已配围栏需在范围内且 SSID 正确;未配围栏时仅校验 SSID)' : '';
473 473 if (rf && rw) {
474 474 return "\u95E8\u5E97\u8981\u6C42\uFF1A\u8303\u56F4\u6216 Wi-Fi \u6EE1\u8DB3\u5176\u4E00\u5373\u53EF\u3002".concat(fenceLine, "\uFF1B").concat(wifiLine);
475 475 }
... ...
绿纤uni-app/unpackage/dist/dev/mp-weixin/pages/laundry-flow-send/laundry-flow-send.js
... ... @@ -224,7 +224,9 @@ var _default = {
224 224 showDateTimePicker: false,
225 225 currentDateTimeValue: 0,
226 226 // 当前正在编辑时间的记录下标
227   - currentTimeIndex: -1
  227 + currentTimeIndex: -1,
  228 + // 当前正在编辑的记录下标(用于选择弹窗回填)
  229 + currentRecordIndex: -1
228 230 };
229 231 },
230 232 onLoad: function onLoad() {
... ...
绿纤uni-app/unpackage/dist/dev/mp-weixin/pages/login/login.wxss
... ... @@ -147,6 +147,14 @@
147 147 color: #1f2937;
148 148 background: transparent;
149 149 border: none;
  150 + outline: none;
  151 + -webkit-appearance: none;
  152 + appearance: none;
  153 +}
  154 +.lp-input.data-v-b237504c:focus {
  155 + border: none;
  156 + outline: none;
  157 + box-shadow: none;
150 158 }
151 159 .lp-placeholder.data-v-b237504c {
152 160 color: #9ca3af;
... ...
绿纤uni-app/unpackage/dist/dev/mp-weixin/pages/member-create/member-create.js
... ... @@ -173,7 +173,7 @@ var _default = {
173 173 // 选项数据
174 174 memberTypeOptions: ['老客', '新客'],
175 175 memberTypeIndex: 0,
176   - memberSourceOptions: ['自然到店', '嘉宾', '售后', '直播间', '转店顾客', '美团', '联联', '三方拓客', '其他', '补录'],
  176 + memberSourceOptions: ['自然到店', '嘉宾', '售后', '直播间', '转店顾客', '美团', '联联', '三方拓客', '其他', '补录', '抖音'],
177 177 memberSourceIndex: 0,
178 178 // 推荐人相关
179 179 showReferrerGroup: false,
... ...
绿纤uni-app/unpackage/dist/dev/mp-weixin/pages/member-edit/member-edit.js
... ... @@ -195,7 +195,7 @@ var _default = {
195 195 genderIndex: null,
196 196 memberTypeOptions: ['老客', '新客'],
197 197 memberTypeIndex: 0,
198   - memberSourceOptions: ['19.9卡', '自然到店', '嘉宾', '售后', '直播间', '转店顾客', '美团', '联联', '三方拓客', '其他', '补录'],
  198 + memberSourceOptions: ['19.9卡', '自然到店', '嘉宾', '售后', '直播间', '转店顾客', '美团', '联联', '三方拓客', '其他', '补录', '抖音'],
199 199 memberSourceIndex: 1,
200 200 // 默认选择"自然到店"
201 201  
... ...
绿纤uni-app/unpackage/dist/dev/mp-weixin/pagesA/lx/lx.js
... ... @@ -354,6 +354,9 @@ var _default = {
354 354 }, {
355 355 text: '合作方退',
356 356 value: '合作方退'
  357 + }, {
  358 + text: '抖音',
  359 + value: '抖音'
357 360 }],
358 361 sfskddOptions: [{
359 362 text: '是',
... ...
绿纤uni-app/unpackage/dist/dev/mp-weixin/pagesA/member-consume/member-consume.js
... ... @@ -907,6 +907,8 @@ var _default = {
907 907 this.formData.hyzh = selectedOption.value;
908 908 this.formData.hymc = selectedOption.label;
909 909 this.formData.gklx = selectedOption.khlx || '';
  910 + this.pxList = [];
  911 + this.addPxRow();
910 912 }
911 913 }
912 914 this.closeModal();
... ...
绿纤uni-app/unpackage/dist/dev/mp-weixin/pagesA/reimbursement-detail/reimbursement-detail.js
... ... @@ -925,16 +925,18 @@ var _default = {
925 925 });
926 926 return;
927 927 }
  928 + console.error(file, attachmentList);
928 929 var fullUrl = file.url.startsWith('http') ? file.url : "".concat(this.baseUrl).concat(file.url);
929 930  
930 931 // 判断文件类型
931   - var fileExtension = this.getFileExtension(file.name || file.url);
  932 + var fileExtension = this.getFileExtension(file.fileId || file.url);
  933 + console.error(fileExtension);
932 934 var imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'];
933 935 if (imageExtensions.includes(fileExtension.toLowerCase())) {
934 936 // 图片类型:预览
935 937 // 构建所有图片URL列表
936 938 var imageUrls = attachmentList.filter(function (item) {
937   - var ext = _this6.getFileExtension(item.name || item.url);
  939 + var ext = _this6.getFileExtension(item.fileId || item.url);
938 940 return imageExtensions.includes(ext.toLowerCase());
939 941 }).map(function (item) {
940 942 var url = item.url.startsWith('http') ? item.url : "".concat(_this6.baseUrl).concat(item.url);
... ...
绿纤uni-app/unpackage/dist/dev/mp-weixin/pagesA/reimbursement-form/reimbursement-form.js
... ... @@ -1419,17 +1419,24 @@ var _default = {
1419 1419 params = {
1420 1420 currentPage: _this11.purchaseQuery.currentPage,
1421 1421 pageSize: _this11.purchaseQuery.pageSize,
1422   - approveStatus: '未审批',
1423   - // 只选择未审批的购买记录
  1422 + approveStatus: '未审批' // 只选择未审批的购买记录
1424 1423 // createUserStoreId: this.formData.applicationStoreId || '暂无',
1425   - createUser: _this11.newuserInfo && _this11.newuserInfo.id ? _this11.newuserInfo.id : '暂无'
  1424 + // createUser:this.newuserInfo&&this.newuserInfo.id?this.newuserInfo.id:'暂无',
1426 1425 };
  1426 +
  1427 + if (_this11.newuserInfo.gw == '店助' || _this11.newuserInfo.gw == '店长') {
  1428 + params.createUserStoreId = _this11.newuserInfo && _this11.newuserInfo.mdid ? _this11.newuserInfo.mdid : '暂无';
  1429 + } else {
  1430 + if (_this11.userInfo && _this11.userInfo.userId) {
  1431 + params.createUser = _this11.newuserInfo && _this11.newuserInfo.id ? _this11.newuserInfo.id : '暂无';
  1432 + }
  1433 + }
1427 1434 if (_this11.searchKeyword) {
1428 1435 params.reimbursementCategoryName = _this11.searchKeyword;
1429 1436 }
1430   - _context10.next = 6;
  1437 + _context10.next = 7;
1431 1438 return _purchase.default.getPurchaseList(params);
1432   - case 6:
  1439 + case 7:
1433 1440 res = _context10.sent;
1434 1441 if (res.code === 200 && res.data) {
1435 1442 newList = res.data.list || [];
... ... @@ -1450,10 +1457,10 @@ var _default = {
1450 1457 }
1451 1458 _this11.purchaseTotal = 0;
1452 1459 }
1453   - _context10.next = 16;
  1460 + _context10.next = 17;
1454 1461 break;
1455   - case 10:
1456   - _context10.prev = 10;
  1462 + case 11:
  1463 + _context10.prev = 11;
1457 1464 _context10.t0 = _context10["catch"](0);
1458 1465 console.error('加载购买记录失败:', _context10.t0);
1459 1466 uni.showToast({
... ... @@ -1465,16 +1472,16 @@ var _default = {
1465 1472 _this11.filteredPurchaseList = [];
1466 1473 }
1467 1474 _this11.purchaseTotal = 0;
1468   - case 16:
1469   - _context10.prev = 16;
  1475 + case 17:
  1476 + _context10.prev = 17;
1470 1477 _this11.purchaseListLoading = false;
1471   - return _context10.finish(16);
1472   - case 19:
  1478 + return _context10.finish(17);
  1479 + case 20:
1473 1480 case "end":
1474 1481 return _context10.stop();
1475 1482 }
1476 1483 }
1477   - }, _callee10, null, [[0, 10, 16, 19]]);
  1484 + }, _callee10, null, [[0, 11, 17, 20]]);
1478 1485 }))();
1479 1486 },
1480 1487 // 加载更多购买记录
... ...