|
|
@@ -2803,7 +2803,7 @@ async function cachedPayrollLessons(context,input,month) {
|
|
|
const companyId=companyIdOf(context,input),raw=await Psql.query('SELECT l.*,c."objectId" AS "lessonObjectId",c."generalId",c."createdAt" AS "commonCreatedAt",a."jssj" AS "appointmentEnd",u."realName" AS "coachRealName",u."nickname" AS "coachNickname",u."username" AS "coachUsername",u."legacyUserData" AS "coachLegacy" FROM "LessonRecordFact" l LEFT JOIN "CommonModel" c ON c."company"=l."company" AND CAST(c."modelId" AS text)=\'59\' AND CAST(c."generalId" AS text)=CAST(l."legacyGeneralId" AS text) LEFT JOIN "CommonModel" ac ON ac."company"=l."company" AND CAST(ac."modelId" AS text)=\'54\' AND CAST(ac."generalId" AS text)=CAST(l."yyds" AS text) LEFT JOIN "CourseAppointment" a ON a."company"=l."company" AND CAST(a."id" AS text)=CAST(ac."itemId" AS text) LEFT JOIN "_User" u ON u."company"=l."company" AND COALESCE(CAST(u."legacyUserId" AS text),u."legacyUserData"->>\'UserID\')=CAST(l."jsmz" AS text) WHERE ($1::text IS NULL OR l."company"=$1)',[companyId]);
|
|
|
return raw.map((row)=>{const legacy=legacyOf({legacyUserData:row.coachLegacy});return payrollSourceProjection({...row,legacyGeneralId:row.legacyGeneralId||row.generalId,coachName:row.coachName||row.coachRealName||row.coachNickname||legacy.HoneyName||row.coachUsername,studentName:row.studentName||row.xymz,courseName:row.courseName||row.kcmc});},'cache').filter((row)=>row.lessonAt.slice(0,7)===month);
|
|
|
}
|
|
|
-async function payrollSourceRows(context,input,month,requireLive=false) { const live=await livePayrollLessons(month),items=live.available?live.items:await cachedPayrollLessons(context,input,month);if(requireLive&&!live.available)fail(503,'实时上课记录不可用,当前禁止生成或审核工资单');const companyId=companyIdOf(context,input),users=await Psql.query('SELECT u.*,p."realName" AS "storeRealName",p."nickname" AS "storeNickname",p."username" AS "storeUsername",p."legacyUserData" AS "storeLegacy" FROM "_User" u LEFT JOIN "_User" p ON p."company"=u."company" AND COALESCE(CAST(p."legacyUserId" AS text),p."legacyUserData"->>\'UserID\')=COALESCE(u."legacyUserData"->>\'ParentUserID\',\'0\') WHERE ($1::text IS NULL OR u."company"=$1)',[companyId]).catch(()=>[]),userMap=new Map(users.map((row)=>[number(row.legacyUserId||legacyOf(row).UserID),row]));for(const item of items){const coach=userMap.get(item.coachId);if(!coach)continue;const legacy=legacyOf(coach),storeLegacy=legacyOf({legacyUserData:coach.storeLegacy});item.coachName=displayName(coach);item.coachMobile=mobileOf(coach);item.storeId=item.storeId||number(legacy.ParentUserID);item.storeName=text(coach.storeRealName||coach.storeNickname||storeLegacy.HoneyName||coach.storeUsername)||'未绑定门店';}return{items,sourceStatus:{available:live.available,mode:live.available?'live':'cache',message:live.available?live.message:live.message+',当前显示缓存数据',total:live.total,refreshedAt:live.refreshedAt||new Date().toISOString()}}; }
|
|
|
+async function payrollSourceRows(context,input,month,requireLive=false) { const shouldRefresh=requireLive||input.refresh!==false,live=shouldRefresh?await livePayrollLessons(month):{available:false,message:'正在后台刷新旧系统实时上课记录',items:[],total:0,refreshedAt:''},items=live.available?live.items:await cachedPayrollLessons(context,input,month);if(requireLive&&!live.available)fail(503,'实时上课记录不可用,当前禁止生成或审核工资单');const companyId=companyIdOf(context,input),users=await Psql.query('SELECT u.*,p."realName" AS "storeRealName",p."nickname" AS "storeNickname",p."username" AS "storeUsername",p."legacyUserData" AS "storeLegacy" FROM "_User" u LEFT JOIN "_User" p ON p."company"=u."company" AND COALESCE(CAST(p."legacyUserId" AS text),p."legacyUserData"->>\'UserID\')=COALESCE(u."legacyUserData"->>\'ParentUserID\',\'0\') WHERE ($1::text IS NULL OR u."company"=$1)',[companyId]).catch(()=>[]),userMap=new Map(users.map((row)=>[number(row.legacyUserId||legacyOf(row).UserID),row]));for(const item of items){const coach=userMap.get(item.coachId);if(!coach)continue;const legacy=legacyOf(coach),storeLegacy=legacyOf({legacyUserData:coach.storeLegacy});item.coachName=displayName(coach);item.coachMobile=mobileOf(coach);item.storeId=item.storeId||number(legacy.ParentUserID);item.storeName=text(coach.storeRealName||coach.storeNickname||storeLegacy.HoneyName||coach.storeUsername)||'未绑定门店';}return{items,sourceStatus:{available:live.available,mode:live.available?'live':'cache',message:live.available?live.message:live.message+',当前显示缓存数据',total:live.available?live.total:items.length,refreshedAt:live.refreshedAt||new Date().toISOString()}}; }
|
|
|
async function newClassObjects(className,context,input,limit=1000) { try { const fields=await fieldsOf(className).catch(()=>({})); if(!Object.keys(fields).length)return[]; const query=new Parse.Query(className); const company=companyPointer(context,input); if(company&&fields.company) query.equalTo('company',company); query.limit(limit); query.descending(fields.createdAt?'createdAt':'objectId'); return await query.find({useMasterKey:true}); } catch(error) { if(error.code===100||error.code===103||/class|schema|column .* does not exist/i.test(text(error.message))) return []; throw error; } }
|
|
|
async function availabilityRows(context,input,coachId=0) { const rows=await newClassObjects('CoachAvailability',context,input,1000); return rows.filter((row)=>!coachId||number(row.get('coachId'))===coachId).map((row)=>({objectId:row.id,coachId:number(row.get('coachId')),ruleType:text(row.get('ruleType'))||'weekly',weekday:number(row.get('weekday')),date:text(row.get('date')),startTime:text(row.get('startTime')),endTime:text(row.get('endTime')),available:row.get('available')!==false,reason:text(row.get('reason')),updatedAt:dateIso(row.updatedAt)})); }
|
|
|
function defaultPayRates() { return [{objectId:'default-1',classType:1,classTypeLabel:classType(1),amount:20,durationHours:.5,effectiveFrom:'1970-01-01',active:true,isDefault:true},{objectId:'default-2',classType:2,classTypeLabel:classType(2),amount:40,durationHours:1,effectiveFrom:'1970-01-01',active:true,isDefault:true},{objectId:'default-3',classType:3,classTypeLabel:classType(3),amount:40,durationHours:1,effectiveFrom:'1970-01-01',active:true,isDefault:true}]; }
|