lxy_01 2 weeks ago
parent
commit
3233a7a291

+ 5 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ReportController.java

@@ -1662,5 +1662,10 @@ public class ReportController {
     public HttpRespMsg deleteDuplicateData(Integer companyId, String createDate){
     public HttpRespMsg deleteDuplicateData(Integer companyId, String createDate){
         return reportService.deleteDuplicateData(companyId, createDate);
         return reportService.deleteDuplicateData(companyId, createDate);
     }
     }
+
+    @RequestMapping("/exportMealStatistic")
+    public HttpRespMsg exportMealStatistic(String deptIds,String userId,String startDate,String endDate){
+        return reportService.exportMealStatistic(deptIds,userId,startDate,endDate);
+    }
 }
 }
 
 

+ 2 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ReportService.java

@@ -168,4 +168,6 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg updateHasDeleteTeamData();
     HttpRespMsg updateHasDeleteTeamData();
 
 
     HttpRespMsg deleteDuplicateData(Integer companyId, String createDate);
     HttpRespMsg deleteDuplicateData(Integer companyId, String createDate);
+
+    HttpRespMsg exportMealStatistic(String deptIds,String userId,String startDate,String endDate);
 }
 }

+ 32 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/MealApplicationsServiceImpl.java

@@ -240,6 +240,7 @@ public class MealApplicationsServiceImpl extends ServiceImpl<MealApplicationsMap
             if (status != null) {
             if (status != null) {
                 switch (status) {
                 switch (status) {
                     case 0 :
                     case 0 :
+                        mealMap.put("statusString","已报餐");
                     case  3:
                     case  3:
                         mealMap.put("statusString","缺餐");
                         mealMap.put("statusString","缺餐");
                         break;
                         break;
@@ -323,6 +324,37 @@ public class MealApplicationsServiceImpl extends ServiceImpl<MealApplicationsMap
             }
             }
             map.put("personList",personList);
             map.put("personList",personList);
 
 
+            if(map.get("userId")!= null && !map.get("userId").equals("0")){
+                //非小计合计
+                //已申请
+                map.put("totalApplication",personList.stream().filter(p ->
+                        new Integer(0).equals(p.get("status"))).count());
+                //已用餐
+                map.put("totalGetMeal",personList.stream().filter(p ->
+                        new Integer(1).equals(p.get("status"))).count());
+                //已过期
+                map.put("totalOverLine",personList.stream().filter(p ->
+                        new Integer(3).equals(p.get("status"))).count());
+            }
+            else if (map.get("userId")!= null && map.get("userId").equals("0")){
+                //小计合计
+                //已报餐人数
+                map.put("totalApplication",personList.stream()
+                        .filter(p -> p.get("applyAmount")!=null)
+                        .map(person -> person.get("applyAmount"))
+                        .reduce(0,(a,b) -> (Integer)a + (Integer) b));
+                //已取餐
+                map.put("totalGetMeal",personList.stream()
+                        .filter(p -> p.get("getMeal")!=null)
+                        .map(person -> person.get("getMeal"))
+                        .reduce(0,(a,b) -> (Integer)a + (Integer) b));
+                //已过期
+                map.put("totalOverLine",personList.stream()
+                        .filter(p -> p.get("overLine")!=null)
+                        .map(person -> person.get("overLine"))
+                        .reduce(0,(a,b) -> (Integer)a + (Integer) b));
+            }
+
             records.add(map);
             records.add(map);
         }
         }
         resultMap.put("total",userIPage.getTotal());
         resultMap.put("total",userIPage.getTotal());

+ 115 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -146,6 +146,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
 
     //同一个人的重复提交时间,不得超过1秒
     //同一个人的重复提交时间,不得超过1秒
     public static volatile HashMap<String, Long>  userSubmitTime = new HashMap();
     public static volatile HashMap<String, Long>  userSubmitTime = new HashMap();
+    @Autowired
+    private MealApplicationsService mealApplicationsService;
 
 
     @Synchronized
     @Synchronized
     @Override
     @Override
@@ -6419,4 +6421,117 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
         }
         return msg;
         return msg;
     }
     }
+
+    @Override
+    public HttpRespMsg exportMealStatistic(String deptIds, String userId, String startDate, String endDate) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        List<MealApplications> resultList = mealApplicationsService.getBaseMapper().selectList(new QueryWrapper<MealApplications>()
+                .ge("application_date",LocalDate.parse(startDate,dtf))
+                .le("application_date",LocalDate.parse(endDate,dtf))
+                .ne("status",2));
+        /*
+        * 测试用
+        * */
+        for (MealApplications mealApplications:resultList) {
+            mealApplications.setQrCode(userMapper.selectById(mealApplications.getUserId()).getName());
+            System.out.println(mealApplications.toString());
+        }
+
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
+
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        titleList.add("");
+        titleList.add("工位名称");
+        titleList.add("报餐人");
+        titleList.add("是否报餐");
+        titleList.add("已取餐");
+        titleList.add("未取餐");
+        titleList.add("日期");
+        dataList.add(titleList);
+
+        for (MealApplications map : resultList) {
+            if(dataList.stream().noneMatch(item-> item.get(0).equals(map.getUserId()) && item.get(6).equals(map.getApplicationDate().toString())))
+            {
+                List<String> itemMap=new ArrayList<>();
+                String itemUserId = map.getUserId();
+                if(itemUserId!=null){
+                    itemMap.add(map.getUserId());
+                }
+                else {
+                    itemUserId = "0";
+                    itemMap.add("");
+                }
+                User itemUser = userMapper.selectById(itemUserId);
+
+                itemMap.add(convertDepartmentIdToCascade(itemUser.getDepartmentId(), departmentList));
+                itemMap.add(itemUser.getName());
+                itemMap.add("0");//是否报餐
+                itemMap.add("0");//已取餐
+                itemMap.add("0");//未取餐
+                itemMap.add(map.getApplicationDate().toString());
+                switch (map.getStatus()){
+                    case 0:
+                        itemMap.set(3,"1");
+                        break;
+                    case 1:
+                        itemMap.set(4,"1");
+                        itemMap.set(3,"1");
+                        break;
+                    case 3:
+                        itemMap.set(5,"1");
+                        itemMap.set(3,"1");
+                        break;
+                    case 2:
+                    default:
+                        break;
+                }
+                System.out.println(itemMap);
+                dataList.add(itemMap);
+            }
+            else {
+                for(List<String> i :dataList ){
+                    if (i.get(0)!= null && i.get(0).equals(map.getUserId()) && i.get(6)!=null && i.get(6).equals(map.getApplicationDate().toString()) ) {
+
+                        Integer aInt = 0;
+                        switch (map.getStatus()){
+                            case 0:
+                                aInt = Integer.parseInt(i.get(3)) + 1;
+                                i.set(3,aInt.toString());
+                                break;
+                            case 1:
+                                aInt = Integer.parseInt(i.get(4)) + 1;
+                                i.set(4,aInt.toString());
+                                aInt = Integer.parseInt(i.get(3)) + 1;
+                                i.set(3,aInt.toString());
+                                break;
+                            case 3:
+                                aInt = Integer.parseInt(i.get(5)) + 1;
+                                i.set(5,aInt.toString());
+                                aInt = Integer.parseInt(i.get(3)) + 1;
+                                i.set(3,aInt.toString());
+                                break;
+                            case 2:
+                            default:
+                                break;
+                        }
+
+                        System.out.println(i);
+                    }
+                }
+            }
+        }
+        for(List<String> item:dataList){
+            item.remove(0);
+        }
+        Company company = companyMapper.selectById(companyId);
+        String fileName=("报餐数据表_")+company.getCompanyName()+System.currentTimeMillis();
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName, dataList, path);
+        msg.setData(resp);
+        return msg;
+    }
 }
 }

+ 50 - 19
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/statistic/index.vue

@@ -306,34 +306,39 @@
             <el-table v-if="ins == 7"  :key="8" border :data="mealApplicationList" highlight-current-row v-loading="listLoading" :height="+tableHeight - 1" style="width: 100%;">
             <el-table v-if="ins == 7"  :key="8" border :data="mealApplicationList" highlight-current-row v-loading="listLoading" :height="+tableHeight - 1" style="width: 100%;">
                 <el-table-column align="center" prop="departmentCascade" label="部门名称" min-width="150" fixed="left">
                 <el-table-column align="center" prop="departmentCascade" label="部门名称" min-width="150" fixed="left">
                   <template slot-scope="scope">
                   <template slot-scope="scope">
-                    {{scope.row.departmentCascade}}
+                    {{scope.row.departmentName}}
                   </template>
                   </template>
                 </el-table-column>
                 </el-table-column>
                 <el-table-column align="center" prop="name" label="人员" min-width="100" fixed="left"></el-table-column>
                 <el-table-column align="center" prop="name" label="人员" min-width="100" fixed="left"></el-table-column>
-                <el-table-column v-for="(item, index) in personWorkHoursWagesHead" :key="index" :label="item" align="center" min-width="150">
+                <el-table-column v-for="(item, index) in personMealHead" :key="index" :label="item" align="center" min-width="150">
                     <template slot-scope="scope">
                     <template slot-scope="scope">
-                        <div v-for="(items, indexs) in scope.row.personWorkHoursWages" :key="indexs" :class="`${scope.row.departmentCascade== '小计' ? '' : 'colorText'}`">
-                            <div v-if="items.crateDate == item" @click.stop="showReportDetail(scope.row,item,0)">
-                              <div  style="color: black;" v-if="items.planWorkTime">平均 {{items.planWorkTime}}分钟  {{items.planCost}}元</div>
-                              <!-- <div @click.stop="showReportDetail(scope.row,item,0)" v-if="items.workTime>0">已填 {{items.workTime}}分钟  {{items.cost}}元 </div>{{items.leave}}
-                              <div style="color: green;" @click.stop="showTempReportDetail(scope.row,item,0)" v-if="items.tempWorkTime>0||items.tempCost>0">临时报工 {{items.tempWorkTime}}分钟  {{items.tempCost}}元</div> -->
-                              <div  v-if="items.workTime>0">已填 {{items.workTime}}分钟  {{items.cost}}元 </div>{{items.leave}}
-                              <div style="color: green;" v-if="items.tempWorkTime>0||items.tempCost>0">临时报工 {{items.tempWorkTime}}分钟  {{items.tempCost}}元</div>
-                              <div style="color: red;" v-if="items.surplusTime">剩余 {{items.surplusTime}}分钟  {{items.surplusCost}}元</div>
+                        <div v-for="(items, indexs) in scope.row.personList" :key="indexs" >
+                            <div v-if="items.date == item">
+                                <div v-if = "items.userId !== '0' " :style="textColorStyle(items.status)">
+                                  {{items.statusString || '暂无状态' }}
+                                </div>
+                                
+                                <div v-if = "items.userId === '0' && items.applyAmount > 0" style = "color: #ff0000; ">
+                                  <div>
+                                    报餐人数:{{items.applyAmount}}
+                                  </div>
+                                  <div>
+                                    就餐人数:{{items.getMeal}}
+                                  </div>
+                                  <div>
+                                    漏餐人数:{{items.overLine}}
+                                  </div>
+
+                                </div>
                             </div>
                             </div>
                         </div>
                         </div>
                     </template>
                     </template>
                 </el-table-column>
                 </el-table-column>
                 <el-table-column align="center" prop="totalResult" label="合计" min-width="180">
                 <el-table-column align="center" prop="totalResult" label="合计" min-width="180">
                    <template slot-scope="scope" >
                    <template slot-scope="scope" >
-                    <div @click="showReportDetail(scope.row,item,1)">
-                      <div style="color: black;">{{scope.row.totalPlanResult | formatStr('平均') }}</div>
-                      <!-- <div style="color: #02a7f0;"  @click="showReportDetail(scope.row,item,1)"> {{scope.row.totalResult | formatStr('已填')}}</div> 
-                      <div style="color: green;"  @click="showTempReportDetail(scope.row,item,1)">{{scope.row.totalTempResult | formatStr('临时报工')}}</div>  -->
-                      <div style="color: #02a7f0;" > {{scope.row.totalResult | formatStr('已填')}}</div> 
-                      <div style="color: green;" >{{scope.row.totalTempResult | formatStr('临时报工')}}</div> 
-                      <div style="color: red;">{{scope.row.totalSurplusResult | formatStr('剩余') }}</div>
-                    </div>
+                      <div style="color: #02a7f0;" > 报餐次数:{{scope.row.totalApplication}}</div> 
+                      <div style="color: red;"> 就餐次数:{{scope.row.totalGetMeal }}</div>
+                      <div style="color: green;" > 缺餐次数:{{scope.row.totalOverLine}}</div> 
                   </template>
                   </template>
                 </el-table-column>
                 </el-table-column>
             </el-table>
             </el-table>
@@ -734,6 +739,7 @@ export default {
       { name: '饿哇噶', id: 1 },
       { name: '饿哇噶', id: 1 },
       { name: '第三方', id: 2}
       { name: '第三方', id: 2}
       ],
       ],
+      personMealHead:[],
 
 
       //筛选项
       //筛选项
       productId:"",
       productId:"",
@@ -751,7 +757,20 @@ export default {
       exportTargetUserId:null,
       exportTargetUserId:null,
     };
     };
   },
   },
-  computed: {},
+  computed: {
+    textColorStyle() {
+        return (status) => {
+            const colorMap = {
+                0: { color: '#ff0000' },
+                1: { color: '#0000ff' },
+                2: { color: '#ff0000' },
+                3: { color: '#0000ff' },
+            };
+            return colorMap[status] || { color: '#333333' }; // 默认颜色
+        };
+    },
+
+  },
   watch: {},
   watch: {},
   created() {
   created() {
     let height = window.innerHeight;
     let height = window.innerHeight;
@@ -1367,6 +1386,9 @@ export default {
         res => {
         res => {
           if (res.code == "ok") {
           if (res.code == "ok") {
             console.log(res.data)
             console.log(res.data)
+            this.mealApplicationList = res.data.records
+            this.personMealHead = res.data.header
+            this.total=res.data.total
             
             
           } else {
           } else {
             this.$message({
             this.$message({
@@ -1628,6 +1650,15 @@ export default {
           url += "/exportPlanDataWithUserId";
           url += "/exportPlanDataWithUserId";
           sl.userId=this.exportTargetUserId
           sl.userId=this.exportTargetUserId
         }
         }
+    }
+    else if (this.ins == 7) {
+      console.log("---------------------------------")
+        fName = '就餐数据表_' + '.xlsx';
+        sl.startDate=this.rangeDatas[0];
+        sl.endDate=this.rangeDatas[1];
+        url += "/exportMealStatistic";
+        sl.deptIds=deptArr.join(',');
+      console.log("---------------------------------" +url)
     }
     }
         this.http.post(url, sl,
         this.http.post(url, sl,
         res => {
         res => {