Quellcode durchsuchen

设备成本统计,导出,使用记录,成本上传

yusm vor 7 Monaten
Ursprung
Commit
cda1daeba8

+ 7 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DeviceCostController.java

@@ -2,12 +2,14 @@ package com.management.platform.controller;
 
 
 import com.management.platform.entity.DeviceCost;
+import com.management.platform.entity.User;
 import com.management.platform.service.DeviceCostService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -42,5 +44,10 @@ public class DeviceCostController {
         return deviceCostService.deleteBatch(ids);
     }
 
+    @RequestMapping("/importDeviceCost")
+    public HttpRespMsg importDeviceCost (HttpServletRequest request, MultipartFile file,String ymonthStr){
+        return deviceCostService.importDeviceCost(request,file,ymonthStr);
+    }
+
 }
 

+ 57 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DeviceLogController.java

@@ -1,10 +1,19 @@
 package com.management.platform.controller;
 
 
+import com.management.platform.entity.Device;
+import com.management.platform.entity.DeviceCost;
+import com.management.platform.entity.DeviceLog;
+import com.management.platform.service.DeviceLogService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * <p>
  *  前端控制器
@@ -17,5 +26,53 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/device-log")
 public class DeviceLogController {
 
+    @Resource
+    private DeviceLogService deviceLogService;
+
+    /**
+     * 传参 参数: startTime,endTime 字符串
+     * @param request
+     * @param deviceLog
+     * @return
+     */
+    @RequestMapping("/getDeviceLogList")
+    public HttpRespMsg getDeviceLogList (HttpServletRequest request, DeviceLog deviceLog){
+        return deviceLogService.getDeviceLogList(request,deviceLog);
+    }
+
+    /**
+     * 传参 参数: startTime,endTime字符串,id
+     * @param request
+     * @param deviceLog
+     * @return
+     */
+    @RequestMapping("/getDeviceLogDetail")
+    public HttpRespMsg getDeviceLogDetail (HttpServletRequest request, DeviceLog deviceLog){
+        return deviceLogService.getDeviceLogDetail(request,deviceLog);
+    }
+
+
+    /**
+     * 参数 id,projectId,startTime,deviceLogId,startOrEnd,useTime
+     * @param request
+     * @param device
+     * @return
+     */
+    @RequestMapping("/updateDeviceUsageStatus")
+    @Transactional(rollbackFor = Exception.class)
+    public HttpRespMsg updateDeviceUsageStatus (HttpServletRequest request, Device device){
+        return deviceLogService.updateDeviceUsageStatus(request,device);
+    }
+
+    @RequestMapping("/getDeviceTimeCost")
+    public HttpRespMsg getDeviceTimeCost(HttpServletRequest request,String startDate, String endDate, Integer projectId,Integer type) {
+        return deviceLogService.getDeviceTimeCost(request,startDate, endDate,projectId,type);
+    }
+
+    @RequestMapping("/exportDeviceTimeCost")
+    public HttpRespMsg exportDeviceTimeCost(HttpServletRequest request,String startDate, String endDate, Integer projectId) {
+        return deviceLogService.exportDeviceTimeCost(request,startDate, endDate,projectId);
+    }
+
 }
 

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Device.java

@@ -91,6 +91,26 @@ public class Device extends Model<Device> {
     @TableField("usage_user_id")
     private String usageUserId;
 
+    @TableField(exist = false)
+    private String usageUserName;
+
+    @TableField(exist = false)
+    private Integer projectId;
+
+    @TableField(exist = false)
+    private String startTime;
+
+    @TableField(exist = false)
+    private String endTime;
+
+    @TableField(exist = false)
+    private Boolean startOrEnd;//开始使用还是结束使用 : true 开始使用,false 结束使用
+
+    @TableField(exist = false)
+    private Integer deviceLogId;
+
+    @TableField("use_time")
+    private Double useTime;
 
     @Override
     protected Serializable pkVal() {

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/DeviceLog.java

@@ -78,6 +78,12 @@ public class DeviceLog extends Model<DeviceLog> {
     @TableField("usage_cost")
     private BigDecimal usageCost;
 
+    /**
+     * 使用时间
+     */
+    @TableField("use_time")
+    private Double useTime;
+
 
     @Override
     protected Serializable pkVal() {

+ 9 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/DeviceLogMapper.java

@@ -2,6 +2,12 @@ package com.management.platform.mapper;
 
 import com.management.platform.entity.DeviceLog;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -13,4 +19,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface DeviceLogMapper extends BaseMapper<DeviceLog> {
 
+    ArrayList<HashMap<String, Object>> getDeviceLogList(@Param("hashMap") HashMap<String, Object> hashMap);
+
+    List<Map<String, Object>> selectListGroupByProject(Integer companyId, String startDate, String endDate, Integer projectId);
 }

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DeviceCostService.java

@@ -3,6 +3,7 @@ package com.management.platform.service;
 import com.management.platform.entity.DeviceCost;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -21,4 +22,6 @@ public interface DeviceCostService extends IService<DeviceCost> {
     HttpRespMsg edit(DeviceCost deviceCost);
 
     HttpRespMsg deleteBatch(String ids);
+
+    HttpRespMsg importDeviceCost(HttpServletRequest request, MultipartFile file,String ymonthStr);
 }

+ 14 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DeviceLogService.java

@@ -1,7 +1,11 @@
 package com.management.platform.service;
 
+import com.management.platform.entity.Device;
 import com.management.platform.entity.DeviceLog;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
+
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * <p>
@@ -13,4 +17,14 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface DeviceLogService extends IService<DeviceLog> {
 
+    HttpRespMsg getDeviceLogList(HttpServletRequest request, DeviceLog deviceLog);
+
+
+    HttpRespMsg updateDeviceUsageStatus(HttpServletRequest request, Device device);
+
+    HttpRespMsg getDeviceLogDetail(HttpServletRequest request, DeviceLog deviceLog);
+
+    HttpRespMsg getDeviceTimeCost(HttpServletRequest request,String startDate, String endDate, Integer projectId, Integer type);
+
+    HttpRespMsg exportDeviceTimeCost(HttpServletRequest request, String startDate, String endDate, Integer projectId);
 }

+ 260 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DeviceCostServiceImpl.java

@@ -1,21 +1,36 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.management.platform.entity.DeviceCost;
-import com.management.platform.entity.User;
+import com.management.platform.entity.*;
+import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.mapper.DeviceCostMapper;
+import com.management.platform.mapper.DeviceLogMapper;
+import com.management.platform.mapper.DeviceMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.DeviceCostService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.EncryptedDocumentException;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.*;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
+import java.io.*;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -29,12 +44,21 @@ import java.util.stream.Collectors;
 @Service
 public class DeviceCostServiceImpl extends ServiceImpl<DeviceCostMapper, DeviceCost> implements DeviceCostService {
 
+    @Resource
+    private DeviceMapper deviceMapper;
+
     @Resource
     private DeviceCostMapper deviceCostMapper;
 
+    @Resource
+    private DeviceLogMapper deviceLogMapper;
+
     @Resource
     private UserMapper userMapper;
 
+    @Value(value = "${upload.path}")
+    private String path;
+
     @Override
     public HttpRespMsg getDeviceCostPage(HttpServletRequest request, DeviceCost deviceCost) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
@@ -76,4 +100,235 @@ public class DeviceCostServiceImpl extends ServiceImpl<DeviceCostMapper, DeviceC
         }
         return httpRespMsg;
     }
+
+    @Override
+    public HttpRespMsg importDeviceCost(HttpServletRequest request, MultipartFile multipartFile,String ymonthStr) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+
+        if (StringUtils.isEmpty(ymonthStr)){
+            msg.setError("请传递月份");
+            return msg;
+        }
+
+        Integer companyId = user.getCompanyId();
+        //然后处理文件
+        String fileName = multipartFile.getOriginalFilename();
+        File file = new File(fileName == null ? "file" : fileName);
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            inputStream = multipartFile.getInputStream();
+            outputStream = new FileOutputStream(file);
+            byte[] buffer = new byte[4096];
+            int temp = 0;
+            while ((temp = inputStream.read(buffer, 0, 4096)) != -1) {
+                outputStream.write(buffer, 0, temp);
+            }
+            inputStream.close();
+            outputStream.close();
+            //然后解析表格
+            Workbook workbook = WorkbookFactory.create(new FileInputStream(file));
+            Sheet sheet = workbook.getSheetAt(0);
+            int rowNum = sheet.getLastRowNum();
+            if (rowNum == 0) {
+                msg.setError("请填写设备成本信息");
+                return msg;
+            }
+            List<Device> deviceList = deviceMapper.selectList(new QueryWrapper<Device>().eq("company_id", companyId));
+            ArrayList<DeviceCost> deviceCostArrayList = new ArrayList<>();
+            int dataIndex = 1;
+            for (int rowIndex = 1; rowIndex <= rowNum; rowIndex++) {
+                Row row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    dataIndex++;
+                    continue;
+                }
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                boolean NoExists = false;
+                for (int i = 0; i < 3; i++) {
+                    if (row.getCell(i) != null) {
+                        row.getCell(i).setCellType(CellType.STRING);
+                    }
+                }
+                if (row.getCell(0) == null) {
+                    msg.setError("第"+dataIndex+"行缺少设备编号");
+                    return msg;
+                }
+                if (row.getCell(1) == null) {
+                    msg.setError("第"+dataIndex+"行缺少设备名称");
+                    return msg;
+                }
+                if (row.getCell(2) == null) {
+                    msg.setError("第"+dataIndex+"行缺少当月成本");
+                    return msg;
+                }
+                String deviceCode = row.getCell(0)==null?null:row.getCell(0).getStringCellValue();
+                String deviceName = row.getCell(1)==null?null:row.getCell(1).getStringCellValue();
+                String monthCost = row.getCell(2)==null?null:row.getCell(2).getStringCellValue();
+                if (StringUtils.isNotEmpty(deviceCode)&&StringUtils.isNotEmpty(deviceName)&&StringUtils.isNotEmpty(monthCost)){
+                    for (Device device : deviceList) {
+                        if (deviceCode.equals(device.getDeviceCode())){
+                            NoExists=true;
+                            break;
+                        }
+                    }
+                    if (NoExists){
+                        Optional<Device> optional = deviceList.stream().filter(d -> d.getDeviceCode().equals(deviceCode)).findFirst();
+                        if (optional.isPresent()){
+                            Device device = optional.get();
+                            if (!deviceName.equals(device.getDeviceName())){
+                                msg.setError("第"+dataIndex+"行设备名称不匹配");
+                                return msg;
+                            }
+                            if (BigDecimal.valueOf(Long.parseLong(monthCost)).compareTo(BigDecimal.ZERO)<0){
+                                msg.setError("第"+dataIndex+"行当月成本为负数");
+                                return msg;
+                            }
+                            DeviceCost deviceCost = new DeviceCost();
+                            deviceCost.setDeviceId(device.getId());
+                            deviceCost.setMonthCost(BigDecimal.valueOf(Double.parseDouble(monthCost)));
+                            deviceCost.setYmonth(ymonthStr);
+
+                            if (!deviceCostArrayList.isEmpty()){
+                                long count = deviceCostArrayList.stream().filter(c -> c.getDeviceId().equals(deviceCost.getDeviceId())).count();
+                                if (count>0){
+                                    msg.setError("存在与第"+dataIndex+"行重复的设备成本数据");
+                                    return msg;
+                                }
+                            }
+                            deviceCostArrayList.add(deviceCost);
+                        }
+                    }else {
+                        msg.setError("第"+dataIndex+"行填写的设备编号跟所在公司不匹配");
+                        return msg;
+                    }
+                }
+                dataIndex++;
+            }
+            List<DeviceCost> selectedList = deviceCostMapper.selectList(new QueryWrapper<DeviceCost>().eq("ymonth", ymonthStr));
+            if(!deviceCostArrayList.isEmpty()){
+                int i = 0;
+                for (DeviceCost deviceCost : deviceCostArrayList) {
+                    if (!selectedList.isEmpty()){
+                        long count = selectedList.stream().filter(s -> s.getDeviceId().equals(deviceCost.getDeviceId()) && s.getYmonth().equals(deviceCost.getYmonth())).count();
+                        if (count>0){
+                            deviceCostMapper.update(null,new UpdateWrapper<DeviceCost>()
+                                    .eq("ymonth",ymonthStr)
+                                    .eq("device_id",deviceCost.getDeviceId()).set("month_cost",deviceCost.getMonthCost()));
+                            i++;
+                        }else {
+                            deviceCostMapper.insert(deviceCost);
+                            i++;
+                        }
+                    }else {
+                        deviceCostMapper.insert(deviceCost);
+                        i++;
+                    }
+                }
+                String[] strings = ymonthStr.split("-");
+                int year = Integer.parseInt(strings[0]);
+                int month = Integer.parseInt(strings[1]);
+                // 获取该月份的第一天
+                String startDate = String.format("%04d-%02d-01", year, month);
+                // 获取该月的最后一天
+                LocalDate lastDate = LocalDate.of(year, month, 1).plusDays(LocalDate.of(year, month, 1).lengthOfMonth() - 1);
+                String endDate = String.format("%04d-%02d-%02d", year, month, lastDate.getDayOfMonth());
+
+                List<DeviceLog> deviceLogs = deviceLogMapper.selectList(new QueryWrapper<DeviceLog>()
+                        .between("create_date", startDate, endDate)
+                        .isNotNull("end_time"));
+                for (DeviceCost deviceCost : deviceCostArrayList) {
+                    BigDecimal monthCost = deviceCost.getMonthCost();
+                    Integer deviceId = deviceCost.getDeviceId();
+                    double sumTime = deviceLogs.stream().filter(dl -> dl.getDeviceId().equals(deviceId)).mapToDouble(DeviceLog::getUseTime).sum();
+                    if (sumTime>0){
+                        BigDecimal result = monthCost.divide(BigDecimal.valueOf(sumTime), 2, RoundingMode.HALF_UP);
+                        List<DeviceLog> deviceLogList = deviceLogs.stream().filter(dl -> dl.getDeviceId().equals(deviceId)).collect(Collectors.toList());
+                        for (DeviceLog deviceLog : deviceLogList) {
+                            Double useTime = deviceLog.getUseTime();
+                            BigDecimal multiply = BigDecimal.valueOf(useTime).multiply(result);
+                            deviceLog.setUsageCost(multiply);
+                        }
+                        List<DeviceLog> sortList = deviceLogList.stream()
+                                .sorted(Comparator.comparing(DeviceLog::getId).reversed())
+                                .collect(Collectors.toList());// 根据 id 降序排序
+                        if (sortList.size()>1){
+                            DeviceLog deviceLog0 = sortList.get(0);
+                            List<DeviceLog> deviceLogs2 = sortList.subList(1, sortList.size());
+                            BigDecimal reduce = deviceLogs2.stream().map(DeviceLog::getUsageCost).reduce(BigDecimal.ZERO, BigDecimal::add);
+                            BigDecimal subtract = monthCost.subtract(reduce);
+                            deviceLog0.setUsageCost(subtract);
+                            deviceLogs2.add(0, deviceLog0);
+
+                            for (DeviceLog deviceLog : deviceLogs2) {
+                                deviceLogMapper.update(null,new UpdateWrapper<DeviceLog>().eq("id", deviceLog.getId()).set("usage_cost", deviceLog.getUsageCost()));
+                            }
+                        }else {
+                            DeviceLog deviceLog = sortList.get(0);
+                            deviceLog.setUsageCost(monthCost);
+                            deviceLogMapper.update(null,new UpdateWrapper<DeviceLog>().eq("id", deviceLog.getId()).set("usage_cost", deviceLog.getUsageCost()));
+
+                        }
+                    }
+
+                }
+
+                msg.data = i;
+                String originName = fileName;
+                //定义一个独立的文件夹
+                String importFolder = "deviceCost_import";
+                File dir = new File(path, importFolder);
+                if (!dir.exists()) {
+                    dir.mkdir();
+                }
+
+                System.out.println("fileName=="+originName);
+                String[] names = originName.split("\\.");
+                String destFileName = names[0] + "_"+System.currentTimeMillis()+"."+names[1];
+                File destFile = new File(dir, destFileName);
+                FileUtils.copyFile(file, destFile);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            //msg.setError("文件处理出错");
+            msg.setError(MessageUtils.message("file.error"));
+            return msg;
+        } catch (NullPointerException e) {
+            e.printStackTrace();
+            //msg.setError("数据格式有误或存在空数据 导入失败");
+            msg.setError(MessageUtils.message("file.dataFormatError"));
+            return msg;
+        }catch (InvalidFormatException e) {
+            e.printStackTrace();
+            //msg.setError("文件格式错误,如果安装了加密软件需要先解密再上传");
+            msg.setError(MessageUtils.message("file.FormatErrorAndDecrypt"));
+            return msg;
+        }catch (EncryptedDocumentException e) {
+            e.printStackTrace();
+            //msg.setError("文件加密状态,需要先解除加密状态再上传");
+            msg.setError(MessageUtils.message("file.encryption"));
+            return msg;
+        } catch (Exception e) {
+            e.printStackTrace();
+            //msg.setError("发生其他错误:"+e.getMessage());
+            msg.setError(MessageUtils.message("other.errorByParameter",e.getMessage()));
+            return msg;
+        } finally {
+            //关闭流
+            try {
+                if (outputStream != null && inputStream != null) {
+                    outputStream.close();
+                    inputStream.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            file.delete();
+        }
+        return msg;
+    }
 }

+ 238 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DeviceLogServiceImpl.java

@@ -1,10 +1,29 @@
 package com.management.platform.service.impl;
 
-import com.management.platform.entity.DeviceLog;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.mapper.DeviceLogMapper;
+import com.management.platform.mapper.DeviceMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.DeviceLogService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.service.DeviceService;
+import com.management.platform.service.ExcelExportService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -16,5 +35,223 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class DeviceLogServiceImpl extends ServiceImpl<DeviceLogMapper, DeviceLog> implements DeviceLogService {
+    @Resource
+    private UserMapper userMapper;
+
+    @Resource
+    private DeviceLogMapper deviceLogMapper;
+
+    @Resource
+    private DeviceMapper deviceMapper;
+
+    @Resource
+    private ExcelExportService excelExportService;
+
+    @Value(value = "${upload.path}")
+    private String path;
+
+    @Override
+    public HttpRespMsg getDeviceLogList(HttpServletRequest request, DeviceLog deviceLog) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        String token = request.getHeader("token");
+        User user = userMapper.selectById(token);
+        HashMap<String, Object> hashMap = new HashMap<>();
+        hashMap.put("companyId", user.getCompanyId());
+        hashMap.put("usageUserId", user.getId());
+        hashMap.put("startDate",deviceLog.getStartTime());
+        hashMap.put("endDate", deviceLog.getEndTime());
+
+        ArrayList<HashMap<String,Object>> maps =deviceLogMapper.getDeviceLogList(hashMap);
+        httpRespMsg.setData(maps);
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg updateDeviceUsageStatus(HttpServletRequest request, Device device) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        String token = request.getHeader("token");
+        User user = userMapper.selectById(token);
+
+        if (device.getProjectId()==null){
+            httpRespMsg.setError("请选择项目");
+            return httpRespMsg;
+        }
+
+        Device selectedDevice = deviceMapper.selectById(device.getId());
+        //开始使用
+        if (device.getStartOrEnd()){
+            //使用中
+            if(selectedDevice.getUsageStatus()!=null&&selectedDevice.getUsageStatus()){
+                httpRespMsg.setError("该设备当前被占用,请换其他设备扫码");
+                return httpRespMsg;
+            }
+            DeviceLog deviceLog = new DeviceLog();
+            deviceLog.setStartTime(device.getStartTime());
+            deviceLog.setCreateDate(LocalDate.now());
+            deviceLog.setDeviceId(selectedDevice.getId());
+            deviceLog.setProjectId(selectedDevice.getProjectId());
+            deviceLog.setUsageUserId(user.getId());
+            deviceLogMapper.insert(deviceLog);
+
+            selectedDevice.setUsageStatus(true);
+            selectedDevice.setUsageUserId(user.getId());
+            deviceMapper.update(null,new UpdateWrapper<Device>()
+                    .eq("id",selectedDevice.getId())
+                    .set("usage_status",selectedDevice.getUsageStatus())
+                    .set("usage_user_id",selectedDevice.getUsageUserId()));
+            return httpRespMsg;
+
+        }
+        //结束使用
+        else {
+            //未使用
+            if(selectedDevice.getUsageStatus()==null|| !selectedDevice.getUsageStatus()){
+                httpRespMsg.setError("该设备当前未被使用,无法结束使用");
+                return httpRespMsg;
+            }
+            DeviceLog deviceLog = deviceLogMapper.selectById(device.getDeviceLogId());
+            deviceLog.setEndTime(device.getEndTime());
+            deviceLog.setUseTime(device.getUseTime());
+            deviceLogMapper.update(null,new UpdateWrapper<DeviceLog>()
+                    .set("end_time",deviceLog.getEndTime()).set("use_time",deviceLog.getUseTime())
+                    .eq("id",deviceLog.getId()));
+            selectedDevice.setUsageStatus(false);
+            selectedDevice.setUsageUserId(null);
+            deviceMapper.update(null,new UpdateWrapper<Device>()
+                    .eq("id",selectedDevice.getId())
+                    .set("usage_status",selectedDevice.getUsageStatus())
+                    .set("usage_user_id",selectedDevice.getUsageUserId()));
+            return httpRespMsg;
+        }
+
+    }
+
+    @Override
+    public HttpRespMsg getDeviceLogDetail(HttpServletRequest request, DeviceLog deviceLog) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        String token = request.getHeader("token");
+        User user = userMapper.selectById(token);
+        HashMap<String, Object> hashMap = new HashMap<>();
+        hashMap.put("companyId", user.getCompanyId());
+        hashMap.put("usageUserId", user.getId());
+        hashMap.put("startDate",deviceLog.getStartTime());
+        hashMap.put("endDate", deviceLog.getEndTime());
+        hashMap.put("deviceLogId", deviceLog.getId());
+
+        ArrayList<HashMap<String,Object>> maps =deviceLogMapper.getDeviceLogList(hashMap);
+        httpRespMsg.setData(maps);
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg getDeviceTimeCost(HttpServletRequest request,String startDate, String endDate, Integer projectId, Integer type) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        try {
+            //根据系统配置的员工成本计算方式,按固定时薪还是固定月薪,分情况计算。
+            User targetUser = userMapper.selectById(request.getHeader("Token"));
+            Integer companyId = targetUser.getCompanyId();
+            Map<String, Object> resultMap = new HashMap<>();
+
+            List<Map<String, Object>> list =deviceLogMapper.selectListGroupByProject(companyId,startDate,endDate,projectId);
+
+            BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
+            for (Map<String, Object> map : list) {
+                if (!map.containsKey("cost")) {
+                    map.put("cost", 0);
+                }
+                if (!map.containsKey("costMoney")) {
+                    map.put("costMoney", 0);
+                } else {
+                    totalMoneyCost = totalMoneyCost.add((BigDecimal)map.get("costMoney"));
+                }
+            }
+
+            if (type.equals(0)){
+                list = list.stream().sorted(Comparator.comparing(l -> -Double.parseDouble(l.get("costMoney").toString()))).collect(Collectors.toList());
+            }else {
+                list = list.stream().sorted(Comparator.comparing(l -> -Double.parseDouble(l.get("cost").toString()))).collect(Collectors.toList());
+            }
+            resultMap.put("costList", list);
+            resultMap.put("totalMoneyCost", totalMoneyCost);
+
+            httpRespMsg.data = resultMap;
+        } catch (NullPointerException e) {
+            e.printStackTrace();
+            //httpRespMsg.setError("验证失败");
+            httpRespMsg.setError(MessageUtils.message("access.verificationError"));
+            return httpRespMsg;
+        }
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg exportDeviceTimeCost(HttpServletRequest request, String startDate, String endDate, Integer projectId) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+
+        User targetUser = userMapper.selectById(request.getHeader("Token"));
+        Integer companyId = targetUser.getCompanyId();
+        List<Map<String, Object>> sumProjectList =deviceLogMapper.selectListGroupByProject(companyId,startDate,endDate,projectId);
+        List<Device> deviceList = deviceMapper.selectList(new QueryWrapper<Device>().eq("company_id", companyId));
+        List<DeviceLog> deviceLogs = deviceLogMapper.selectList(new QueryWrapper<DeviceLog>().between("create_date", startDate, endDate).isNotNull("end_time"));
+
+        ArrayList<List<String>> allList = new ArrayList<>();
+        List<String> headList = new ArrayList<String>();
+        headList.add("项目编号");
+        headList.add("项目名称");
+        headList.add("设备编号");
+        headList.add("设备名称");
+        headList.add("工时(h)");
+        headList.add("成本(元)");
+        allList.add(headList);
+        if (!sumProjectList.isEmpty()){
+            for (Map<String, Object> sum : sumProjectList) {
+                List<String> rowSum = new ArrayList<String>();
+
+                rowSum.add(sum.get("projectCode")==null?"":sum.get("projectCode").toString());
+                rowSum.add(sum.get("projectName")==null?"":sum.get("projectName").toString());
+                rowSum.add("");
+                rowSum.add("");
+                rowSum.add(sum.get("cost")==null?"":sum.get("cost").toString());
+                rowSum.add(sum.get("costMoney")==null?"":sum.get("costMoney").toString());
+                allList.add(rowSum);
+
+                String idProject = sum.get("id").toString();
+                List<Integer> deviceIds = deviceLogs.stream().filter(dl -> dl.getProjectId().toString().equals(idProject)).map(DeviceLog::getDeviceId).distinct().collect(Collectors.toList());
+                if (!deviceIds.isEmpty()){
+                    for (Integer deviceId : deviceIds) {
+                        List<String> row = new ArrayList<String>();
+                        row.add("");
+                        row.add("");
+                        List<Device> deviceList1 = deviceList.stream().filter(d -> d.getId().equals(deviceId)).collect(Collectors.toList());
+                        if (!deviceList1.isEmpty()) {
+                            Device device = deviceList1.get(0);
+                            row.add(device.getDeviceCode());
+                            row.add(device.getDeviceName());
+                        }else {
+                            row.add("");
+                            row.add("");
+                        }
+                        BigDecimal usageCost = deviceLogs.stream()
+                                .filter(dl -> dl.getProjectId().toString().equals(idProject) && dl.getDeviceId().equals(deviceId))
+                                .map(DeviceLog::getUsageCost)
+                                .reduce(BigDecimal.ZERO, BigDecimal::add);
+                        double useTime = deviceLogs.stream()
+                                .filter(dl -> dl.getProjectId().toString().equals(idProject) && dl.getDeviceId().equals(deviceId))
+                                .mapToDouble(DeviceLog::getUseTime).sum();
+                        row.add(usageCost.toString());
+                        row.add(useTime+"");
+                        allList.add(row);
+                    }
+                }
+            }
+        }
 
+        String fileName = "设备成本导出"+System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(null,null,fileName,allList, path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return httpRespMsg;
+    }
 }

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DeviceServiceImpl.java

@@ -150,6 +150,10 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
             return httpRespMsg;
         }else {
             Device one = deviceMapper.selectOne(new QueryWrapper<Device>().eq("id", device.getId()).eq("company_id", user.getCompanyId()));
+            if (one!=null&& one.getUsageStatus()&&StringUtils.isNotEmpty(one.getUsageUserId())){
+                User selectedUser = userMapper.selectById(one.getUsageUserId());
+                one.setUsageUserName(selectedUser.getName());
+            }
             httpRespMsg.setData(one);
             return httpRespMsg;
         }

+ 39 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/DeviceLogMapper.xml

@@ -18,5 +18,44 @@
     <sql id="Base_Column_List">
         id, device_id, project_id, start_time, end_time, create_date, usage_user_id, usage_cost
     </sql>
+    <select id="getDeviceLogList" resultType="java.util.HashMap">
+        SELECT d.id deviceId,d.device_code deviceCode,d.device_name deviceName,d.usage_status usageStatus,d.usage_user_id usageUserId,
+               p.project_code projectCode,p.project_name projectName,
+               dl.create_date createDate,dl.start_time startTime,dl.end_time endTime,dl.id deviceLogId
+        from device d
+                 LEFT JOIN device_log dl on d.id=dl.device_id
+                 INNER JOIN project p on dl.project_id=p.id
+        <where>
+            <if test="startDate !=null and startDate!='' and endDate !=null and endDate!='' ">
+                and dl.create_date BETWEEN #{startDate} and #{endDate}
+            </if>
+            <if test="companyId!=null">
+                and d.company_id=#{companyId}
+            </if>
+            <if test="usageUserId!=null">
+                and dl.usage_user_id=#{usageUserId}
+            </if>
+            <if test="deviceLogId!=null">
+                and dl.id=#{deviceLogId}
+            </if>
+        </where>
+    </select>
+    <select id="selectListGroupByProject" resultType="java.util.Map">
+        select p.id id,p.project_code projectCode,p.project_name projectName,sum(dl.usage_cost) costMoney,sum(dl.use_time) cost
+        from project p
+        LEFT JOIN device_log dl on p.id=dl.project_id
+        <where>
+            <if test="startDate !=null and startDate!='' and endDate !=null and endDate!='' ">
+                and dl.create_date BETWEEN #{startDate} and #{endDate}
+            </if>
+            <if test="companyId!=null">
+                and p.company_id=#{companyId}
+            </if>
+            <if test="projectId!=null">
+                and p.id=#{projectId}
+            </if>
+        </where>
+        group by p.id ,p.project_code,p.project_name
+    </select>
 
 </mapper>