zhoulisky 10 months ago
parent
commit
0105eb7425

+ 36 - 0
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/dto/XmAssetHoursDto.java

@@ -0,0 +1,36 @@
+package org.sky.scientific.pojo.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.sky.scientific.pojo.entity.XmAssetHoursEntity;
+import org.sky.scientific.pojo.vo.DailyAttendance;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class XmAssetHoursDto extends XmAssetHoursEntity {
+
+	@Schema(description = "项目名称")
+	private String xmmc;
+
+	@Schema(description = "资产名称")
+	private String zcmc;
+
+	@Schema(description = "用途")
+	private String yt;
+
+	@Schema(description="使用时长-起始值")
+	private Double monthlyHoursStart;
+
+	@Schema(description="使用时长-结束值")
+	private Double monthlyHoursEnd;
+
+	@Schema(description = "所属年月")
+	private String yearAndMonth;
+
+	@Schema(description = "工时明细")
+	private List<DailyAttendance> dailyHoursList;
+
+}

+ 3 - 12
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/vo/XmAssetHoursVO.java

@@ -1,13 +1,13 @@
 package org.sky.scientific.pojo.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.List;
 
 @Data
-public class XmAssetHoursVO {
+public class XmAssetHoursVO implements Serializable {
 
 	@Schema(description = "项目ID")
 	private Long xmId;
@@ -15,7 +15,7 @@ public class XmAssetHoursVO {
 	@Schema(description = "项目编号")
 	private String xmbh;
 
-	@NotBlank(message = "项目名称不能为空")
+	@Schema(description = "项目名称")
 	private String xmmc;
 
 	@Schema(description = "资产ID")
@@ -39,13 +39,4 @@ public class XmAssetHoursVO {
 	@Schema(description="使用时长/小时")
  	private Double monthlyHours;
 
-	@Schema(description="使用时长-起始值")
-	private Double monthlyHoursStart;
-
-	@Schema(description="使用时长-结束值")
-	private Double monthlyHoursEnd;
-
-	@Schema(description = "所属年月")
-	private String yearAndMonth;
-
 }

+ 20 - 4
kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/AssetController.java

@@ -1,6 +1,7 @@
 
 package org.sky.scientific.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -20,6 +21,7 @@ import org.sky.core.tool.utils.DateUtil;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.excel.AssetExcel;
 import org.sky.scientific.pojo.dto.AssetDTO;
+import org.sky.scientific.pojo.dto.XmAssetHoursDto;
 import org.sky.scientific.pojo.entity.AssetEntity;
 import org.sky.scientific.pojo.entity.XmAssetEntity;
 import org.sky.scientific.pojo.vo.AssetVO;
@@ -133,7 +135,7 @@ public class AssetController extends KdController {
 	}
 
 	@PostMapping("/hours/import")
-	@ApiOperationSupport(order = 4)
+	@ApiOperationSupport(order = 30)
 	@Operation(summary = "科研仪器设备工时登记表-导入", description = "传入excel")
 	public R importXmAssetHours(MultipartFile file,String yearAndMonth) {
 		service.importXmAssetHours(file, yearAndMonth);
@@ -141,9 +143,23 @@ public class AssetController extends KdController {
 	}
 
 	@GetMapping("/hours/page")
-	@ApiOperationSupport(order = 1)
+	@ApiOperationSupport(order = 31)
 	@Operation(summary = "科研仪器设备工时登记表-分页")
-	public R<IPage<XmAssetHoursVO>> selectXmAssetHourspage(XmAssetHoursVO vo, Query query) {
-		return R.data(service.selectXmAssetHoursPage(vo, Condition.getPage(query)));
+	public R<IPage<XmAssetHoursVO>> selectXmAssetHourspage(XmAssetHoursDto dto, Query query) {
+		return R.data(service.selectXmAssetHoursPage(dto, Condition.getPage(query)));
+	}
+
+	@PostMapping("/hours/submit/batch")
+	@ApiOperationSupport(order = 32)
+	@Operation(summary = "科研仪器设备工时登记表-编辑")
+	public R submitAssetHours(@RequestBody XmAssetHoursDto dto) {
+		return R.status(service.batchSubmitXmAssetHours(dto));
+	}
+
+	@PostMapping("/hours/clear/batch")
+	@ApiOperationSupport(order = 33)
+	@Operation(summary = "科研仪器设备工时登记表-清除")
+	public R clearXmAssetHours(@RequestBody JSONObject dto) {
+		return R.status(service.clearXmAssetHours(dto));
 	}
 }

+ 0 - 7
kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/AttendanceController.java

@@ -33,13 +33,6 @@ public class AttendanceController extends KdController {
 		return R.data(service.selectAttendancePage(attendance, Condition.getPage(query)));
 	}
 
-//	@PostMapping("/submit")
-//	@ApiOperationSupport(order = 2)
-//	@Operation(summary = "每月考勤信息-新增或修改")
-//	public R submit(@Valid @RequestBody AttendanceEntity attendance) {
-//		return R.status(service.submit(attendance));
-//	}
-
 	@PostMapping("/submit/batch")
 	@ApiOperationSupport(order = 3)
 	@Operation(summary = "每月考勤信息-批量新增或修改")

+ 4 - 2
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/AttendanceMapper.xml

@@ -61,7 +61,8 @@
     </update>
 
     <select id="selectPrimaryKeyByTechnicianIdAndWorkDate" resultType="java.lang.Long">
-        select id from kd_attendance_records where technician_id = #{technicianId} and work_date = #{workDate}
+        select id from kd_attendance_records
+        where technician_id = #{technicianId} and work_date = #{workDate}
     </select>
 
     <insert id="batchInsert" parameterType="java.util.List">
@@ -73,7 +74,8 @@
     </insert>
 
     <select id="selectByYearAndMonth" resultType="org.sky.scientific.pojo.entity.AttendanceEntity" parameterType="java.lang.String">
-        select id,technician_id as technicianId, work_date as workDate, work_hours as workHours from kd_attendance_records
+        select id,technician_id as technicianId, work_date as workDate, work_hours as workHours
+        from kd_attendance_records
         where left(work_date,6) = #{yearAndMonth}
     </select>
 

+ 1 - 1
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/TechnicianMapper.xml

@@ -47,7 +47,7 @@
 
     <select id="selectTechnicianPage" resultMap="technicianResultMap"
             parameterType="org.sky.scientific.pojo.dto.TechnicianDTO">
-        select *from kd_technician
+        select * from kd_technician
         where is_deleted = 0 and year_and_month = #{technician.yearAndMonth}
         <if test="technician.name!=null and technician.name!=''">and name like concat(concat('%', #{technician.name}),
             '%')

+ 10 - 2
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmAssetHoursMapper.java

@@ -4,6 +4,7 @@ package org.sky.scientific.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
+import org.sky.scientific.pojo.dto.XmAssetHoursDto;
 import org.sky.scientific.pojo.entity.XmAssetHoursEntity;
 import org.sky.scientific.pojo.vo.DailyAttendance;
 import org.sky.scientific.pojo.vo.XmAssetHoursVO;
@@ -18,7 +19,7 @@ import java.util.List;
  */
 public interface XmAssetHoursMapper extends BaseMapper<XmAssetHoursEntity> {
 
-	List<XmAssetHoursEntity> selectByYearAndMonth(@Param("yearAndMonth") String yearAndMonth);
+	List<XmAssetHoursEntity> selectByYearAndMonth(@Param("yearAndMonth") String yearAndMonth, @Param("xmId") Long xmId, @Param("assetId") Long assetId);
 //
 	int batchUpdate(List<XmAssetHoursEntity> list);
 
@@ -26,5 +27,12 @@ public interface XmAssetHoursMapper extends BaseMapper<XmAssetHoursEntity> {
 //
 	List<DailyAttendance> selectHoursByXmIdAndAssetId(@Param("xmId") Long xmId, @Param("assetId") Long assetId, @Param("yearAndMonth") String yearAndMonth);
 //
-	List<XmAssetHoursVO> selectXmAssetHoursPage(IPage<XmAssetHoursVO> page, @Param("ew") XmAssetHoursVO attendance);
+	List<XmAssetHoursVO> selectXmAssetHoursPage(IPage<XmAssetHoursVO> page, @Param("ew") XmAssetHoursDto dto);
+
+	/**
+	 * 清除工时数据
+	 * @param dto
+	 * @return
+	 */
+	int clearXmAssetHours(@Param("yearAndMonth") String yearAndMonth, @Param("xmId") Long xmId, @Param("assetId") Long assetId);
 }

+ 26 - 18
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmAssetHoursMapper.xml

@@ -9,7 +9,6 @@
         <result column="asset_id" property="assetId"/>
         <result column="work_date" property="workDate"/>
         <result column="work_hours" property="workHours"/>
-
         <result column="create_user" property="createUser"/>
         <result column="create_dept" property="createDept"/>
         <result column="create_time" property="createTime"/>
@@ -35,26 +34,20 @@
         </collection>
     </resultMap>
 
-<!--    <select id="selectDailyAttendanceByTechnicianAndMonth" resultType="org.sky.scientific.pojo.vo.DailyAttendance">-->
-<!--        select work_date,work_hours-->
-<!--        from kd_attendance_records-->
-<!--        where technician_id = #{technicianId} and left(work_date,6) = #{yearAndMonth}-->
-<!--        order by work_date asc-->
-<!--    </select>-->
-
     <select id="selectXmAssetHoursPage" resultMap="ResultVoMap">
-        SELECT xa.id,xa.xm_id,xm.xmbh,xm.xmmc,xa.asset_id,asset.zcbm,asset.zcmc,asset.zclb,asset.yt
+        SELECT xa.xm_id,xm.xmbh,xm.xmmc,xa.asset_id,asset.zcbm,asset.zcmc,asset.zclb,asset.yt,
+               (select sum(work_hours) from kd_xm_asset_hours h where h.xm_id = xa.xm_id and h.asset_id = xa.asset_id) as monthly_hours
         FROM kd_xm_asset xa
         LEFT JOIN kd_asset asset ON xa.asset_id = asset.id
-        INNER JOIN
+        LEFT JOIN
         (
-        SELECT
-        xm.id,xm.xmbh,
-        COALESCE( (SELECT bgrz.BGHDZ FROM kd_xm_bgrz bgrz WHERE bgrz.XM_ID = xm.id AND bgrz.ZDMC = 'XMMC' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y%m') <![CDATA[<=]]> #{ew.yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMMC) AS XMMC,
-        COALESCE( (SELECT bgrz.BGHDZ FROM kd_xm_bgrz bgrz WHERE bgrz.XM_ID = xm.id AND bgrz.ZDMC = 'XMKSSJ' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y%m') <![CDATA[<=]]> #{ew.yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMKSSJ) AS XMKSSJ,
-        COALESCE( (SELECT bgrz.BGHDZ FROM kd_xm_bgrz bgrz WHERE bgrz.XM_ID = xm.id AND bgrz.ZDMC = 'XMJSSJ' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y%m') <![CDATA[<=]]> #{ew.yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMJSSJ) AS XMJSSJ
-        FROM kd_xm xm
-        WHERE xm.is_deleted = 0 and DATE_FORMAT(XMKSSJ, '%Y%m') <![CDATA[<=]]> #{ew.yearAndMonth}
+            SELECT
+            xm.id,xm.xmbh,
+            COALESCE( (SELECT bgrz.BGHDZ FROM kd_xm_bgrz bgrz WHERE bgrz.XM_ID = xm.id AND bgrz.ZDMC = 'XMMC' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y%m') <![CDATA[<=]]> #{ew.yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMMC) AS XMMC,
+            COALESCE( (SELECT bgrz.BGHDZ FROM kd_xm_bgrz bgrz WHERE bgrz.XM_ID = xm.id AND bgrz.ZDMC = 'XMKSSJ' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y%m') <![CDATA[<=]]> #{ew.yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMKSSJ) AS XMKSSJ,
+            COALESCE( (SELECT bgrz.BGHDZ FROM kd_xm_bgrz bgrz WHERE bgrz.XM_ID = xm.id AND bgrz.ZDMC = 'XMJSSJ' AND DATE_FORMAT(bgrz.BGSXSJ,'%Y%m') <![CDATA[<=]]> #{ew.yearAndMonth} ORDER BY bgrz.BGSXSJ DESC LIMIT 1),XMJSSJ) AS XMJSSJ
+            FROM kd_xm xm
+            WHERE xm.is_deleted = 0 and DATE_FORMAT(XMKSSJ, '%Y%m') <![CDATA[<=]]> #{ew.yearAndMonth}
         ) xm on xm.id = xa.xm_id
         WHERE xa.year_and_month = #{ew.yearAndMonth}
         <if test="ew.zcmc != null">
@@ -63,6 +56,12 @@
         <if test="ew.xmmc != null">
             and xm.xmmc like concat('%',#{ew.xmmc},'%')
         </if>
+        <if test="ew.yt != null">
+            and xm.yt = #{ew.yt}
+        </if>
+        <if test="ew.monthlyHoursStart!=null and ew.monthlyHoursEnd!=null">
+            and monthly_hours between #{ew.monthlyHoursStart} and #{ew.monthlyHoursEnd}
+        </if>
     </select>
 
     <update id="batchUpdate" parameterType="java.util.List">
@@ -92,7 +91,16 @@
         select id, xm_id, asset_id, work_date, work_hours
         from kd_xm_asset_hours
         where left(work_date,6) = #{yearAndMonth}
+         <if test="xmId!=null">
+             and xm_id = #{xmId}
+         </if>
+        <if test="assetId!=null">
+            and asset_id = #{assetId}
+        </if>
     </select>
 
-
+    <delete id="clearXmAssetHours">
+        DELETE FROM kd_xm_asset_hours
+               WHERE left(work_date,6) = #{yearAndMonth} and xm_id = #{xmId} and asset_id = #{assetId}
+    </delete>
 </mapper>

+ 1 - 1
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/YsZjfyycqdtfyMapper.xml

@@ -37,7 +37,7 @@
 
 
     <select id="selectList" resultMap="ResultVoMap">
-        select z.*, s.yzje,s.zcmc
+        select z.*, s.yzje,s.zcmc,s.zcbm
         from kd_ys_zjfyycqdtfy z
         Left join kd_asset s on s.id = z.asset_id
         where z.is_deleted = 0

+ 18 - 2
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IAssetService.java

@@ -1,11 +1,13 @@
 
 package org.sky.scientific.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.sky.core.mp.base.BaseService;
 import org.sky.scientific.excel.AssetExcel;
 import org.sky.scientific.pojo.dto.AssetDTO;
+import org.sky.scientific.pojo.dto.XmAssetHoursDto;
 import org.sky.scientific.pojo.entity.AssetEntity;
 import org.sky.scientific.pojo.vo.AssetVO;
 import org.sky.scientific.pojo.vo.XmAssetHoursVO;
@@ -76,9 +78,23 @@ public interface IAssetService extends BaseService<AssetEntity> {
 
 	/**
 	 * 科研仪器设备工时登记表-分页
-	 * @param vo
+	 * @param dto
 	 * @param page
 	 * @return
 	 */
-	IPage<XmAssetHoursVO> selectXmAssetHoursPage(XmAssetHoursVO vo, IPage<XmAssetHoursVO> page);
+	IPage<XmAssetHoursVO> selectXmAssetHoursPage(XmAssetHoursDto dto, IPage<XmAssetHoursVO> page);
+
+	/**
+	 * 科研仪器设备工时登记表-编辑
+	 * @param dto
+	 * @return
+	 */
+	boolean batchSubmitXmAssetHours(XmAssetHoursDto dto);
+
+	/**
+	 * 科研仪器设备工时登记表-清除
+	 * @param dto
+	 * @return
+	 */
+	boolean clearXmAssetHours(JSONObject dto);
 }

+ 78 - 15
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/AssetServiceImpl.java

@@ -2,6 +2,8 @@
 package org.sky.scientific.service.impl;
 
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -21,6 +23,7 @@ import org.sky.scientific.mapper.AssetMapper;
 import org.sky.scientific.mapper.XmAssetHoursMapper;
 import org.sky.scientific.mapper.XmMapper;
 import org.sky.scientific.pojo.dto.AssetDTO;
+import org.sky.scientific.pojo.dto.XmAssetHoursDto;
 import org.sky.scientific.pojo.entity.AssetEntity;
 import org.sky.scientific.pojo.entity.XmAssetHoursEntity;
 import org.sky.scientific.pojo.vo.AssetVO;
@@ -32,9 +35,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.BufferedInputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * 资产表 服务实现类
@@ -158,7 +159,7 @@ public class AssetServiceImpl extends BaseServiceImpl<AssetMapper, AssetEntity>
 
 		int batchCount = 20;
 
-		List<XmAssetHoursEntity> dbList = xmAssetHoursMapper.selectByYearAndMonth(yearAndMonth);
+		List<XmAssetHoursEntity> dbList = xmAssetHoursMapper.selectByYearAndMonth(yearAndMonth, null, null);
 		for (XmAssetHoursMonthlyExcel record : records) {
 			//保存
 			if(StringUtil.isAllBlank(record.getXmmc(), record.getXmbh())){
@@ -220,19 +221,81 @@ public class AssetServiceImpl extends BaseServiceImpl<AssetMapper, AssetEntity>
     }
 
 	@Override
-	public IPage<XmAssetHoursVO> selectXmAssetHoursPage(XmAssetHoursVO vo, IPage<XmAssetHoursVO> page) {
-		if (StringUtil.isBlank(vo.getYearAndMonth())) {
+	public IPage<XmAssetHoursVO> selectXmAssetHoursPage(XmAssetHoursDto dto, IPage<XmAssetHoursVO> page) {
+		if (StringUtil.isBlank(dto.getYearAndMonth())) {
 			throw new ServiceException("参数yearAndMonth不能为空");
 		}
-		List<XmAssetHoursVO> list = xmAssetHoursMapper.selectXmAssetHoursPage(page, vo);
-//		for (XmAssetHoursVO temp : list) {
-//			List<DailyAttendance> dailyAttendanceList = xmAssetHoursMapper.selectHoursByXmIdAndAssetId(temp.getXmId(), temp.getAssetId(), vo.getYearAndMonth());
-//			if(CollectionUtil.isEmpty(dailyAttendanceList)){
-//				continue;
-//			}
-//			temp.setMonthlyHours(dailyAttendanceList.stream().mapToDouble(DailyAttendance::getWorkHours).sum());
-//			temp.setDailyAttendances(dailyAttendanceList);
-//		}
+		List<XmAssetHoursVO> list = xmAssetHoursMapper.selectXmAssetHoursPage(page, dto);
+		for (XmAssetHoursVO temp : list) {
+			List<DailyAttendance> dailyAttendanceList = xmAssetHoursMapper.selectHoursByXmIdAndAssetId(temp.getXmId(), temp.getAssetId(), dto.getYearAndMonth());
+			if(CollectionUtil.isEmpty(dailyAttendanceList)){
+				continue;
+			}
+			temp.setDailyAttendances(dailyAttendanceList);
+		}
 		return page.setRecords(list);
 	}
+
+	@Override
+	public boolean batchSubmitXmAssetHours(XmAssetHoursDto dto) {
+		if (StringUtil.isBlank(dto.getYearAndMonth())) {
+			throw new ServiceException("参数yearAndMonth不能为空");
+		}
+		if(dto.getXmId()==null){
+			throw new ServiceException("参数xmId不能为空");
+		}
+		if(dto.getAssetId()==null){
+			throw new ServiceException("参数assetId不能为空");
+		}
+		List<XmAssetHoursEntity> dbList = xmAssetHoursMapper.selectByYearAndMonth(dto.getYearAndMonth(), dto.getXmId(), dto.getAssetId());
+
+		//需要新增的,以便后续批量新增
+		List<XmAssetHoursEntity> insertList = new ArrayList<>();
+		//需要更新的,以便后续批量修改
+		List<XmAssetHoursEntity> updateList = new ArrayList<>();
+
+		for (DailyAttendance dailyAttendance : dto.getDailyHoursList()) {
+
+			List<Long> primaryKeyList = dbList.stream().filter(e -> Objects.equals(e.getWorkDate(), dailyAttendance.getWorkDate())).map(XmAssetHoursEntity::getId).toList();
+			Long primaryKey = CollectionUtil.isEmpty(primaryKeyList) ? null : primaryKeyList.get(0);
+			XmAssetHoursEntity entity = new XmAssetHoursEntity();
+			if (primaryKey == null) {
+				entity.setXmId(dto.getXmId());
+				entity.setAssetId(dto.getAssetId());
+				entity.setWorkDate(dailyAttendance.getWorkDate());
+				entity.setWorkHours(dailyAttendance.getWorkHours());
+				entity.setTenantId(SecureUtil.getTenantId());
+				entity.setCreateUser(SecureUtil.getUserId());
+				entity.setCreateDept(Func.toLong(SecureUtil.getDeptId()));
+				insertList.add(entity);
+			} else {
+				entity.setId(primaryKey);
+				entity.setWorkHours(dailyAttendance.getWorkHours());
+				updateList.add(entity);
+			}
+		}
+
+		if (!insertList.isEmpty()) {
+			xmAssetHoursMapper.batchInsert(insertList);
+			insertList.clear();
+		}
+		if (!updateList.isEmpty()) {
+			xmAssetHoursMapper.batchUpdate(updateList);
+			updateList.clear();
+		}
+		return true;
+	}
+
+	@Override
+	public boolean clearXmAssetHours(JSONObject dto) {
+		JSONArray xmAndAssetIdList = dto.getJSONArray("xmAndAssetIdList");
+		if (xmAndAssetIdList == null || xmAndAssetIdList.isEmpty()) {
+			throw new ServiceException("参数xmAndAssetIdList不能为空");
+		}
+		for (Object xmAndAssetId : xmAndAssetIdList) {
+			Map<String, Long> map =(HashMap<String,Long>) xmAndAssetId;
+			xmAssetHoursMapper.clearXmAssetHours(dto.getString("yearAndMonth"),(Long) map.get("xmId"), (Long)map.get("assetId"));
+		}
+		return true;
+	}
 }