package com.qianwen.smartman.modules.smis.service; import java.io.IOException; import java.nio.charset.Charset; import java.util.List; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.qianwen.core.log.exception.ServiceException; import com.qianwen.core.mp.base.BaseServiceImpl; import com.qianwen.smartman.common.mqtt.MqttMessageSender; import com.qianwen.smartman.modules.smis.entity.CollectDeviceType; import com.qianwen.smartman.modules.smis.entity.Workstation; import com.qianwen.smartman.modules.smis.entity.WorkstationDatapoints; import com.qianwen.smartman.modules.smis.mapper.CollectDeviceTypeMapper; import com.qianwen.smartman.modules.smis.mapper.WorkstationDatapointsMapper; import com.qianwen.smartman.modules.smis.mapper.WorkstationMapper; import com.qianwen.smartman.modules.smis.vo.WorkstationDatapointsSubmitVO; import com.qianwen.smartman.modules.smis.vo.WorkstationDatapointsVO; import cn.hutool.core.util.ObjectUtil; @Service public class WorkstationDatapointsService extends BaseServiceImpl { private Logger log = LoggerFactory.getLogger(this.getClass()); @Autowired private CollectDeviceTypeMapper typeMapper; @Autowired private MqttMessageSender mqttSender; @Autowired private WorkstationMapper workstationMapper; /** * mqtt topic,用于通知collect应用,数据点改变 */ private final String WORKSTATION_DATAPOINT_CHANGED_TOPIC = "mdc/workstation_datapoint_changed"; /** * 新增或者修改工位点位配置 * @param tplVO */ @Transactional public void submit(WorkstationDatapointsSubmitVO dpVO) { if(ObjectUtil.isEmpty(dpVO.getAppId())) { throw new ServiceException("应用ID不能为空"); } Workstation usingWorkstation = appIdUsingWorkstation(dpVO.getAppId(),dpVO.getWorkstationId()); if(usingWorkstation != null) { //appId被使用 String err = "应用ID被占用,工位名称+编号:"+usingWorkstation.getName()+"-"+usingWorkstation.getCode(); throw new ServiceException(err); } WorkstationDatapoints dp = this.baseMapper.selectOne(Wrappers.lambdaQuery().eq(WorkstationDatapoints::getWorkstationId, dpVO.getWorkstationId())); if (dp == null) { //新增 dp = new WorkstationDatapoints(); dp.setDpConfig(dpVO.getDpConfig()); dp.setIsDeleted(0); dp.setWorkstationId(dpVO.getWorkstationId()); dp.setType(dpVO.getType()); dp.setAppId(dpVO.getAppId()); }else { dp.setDpConfig(dpVO.getDpConfig()); dp.setIsDeleted(0); dp.setWorkstationId(dpVO.getWorkstationId()); dp.setType(dpVO.getType()); dp.setAppId(dpVO.getAppId()); } saveOrUpdate(dp); /* WorkstationAppMapping appMap = mpmapper.selectById(dpVO.getWorkstationId()); if(appMap == null) { appMap = new WorkstationAppMapping(); appMap.setAppId(dpVO.getAppId()); appMap.setWorkstationId(dpVO.getWorkstationId()); mpmapper.insert(appMap); }else { appMap.setAppId(dpVO.getAppId()); mpmapper.updateById(appMap); }*/ //发送变更消息 JSONObject payloadObj = new JSONObject(); payloadObj.put("appId", dpVO.getAppId()); payloadObj.put("workstationId", dpVO.getWorkstationId()); mqttSender.sendMessage(WORKSTATION_DATAPOINT_CHANGED_TOPIC, payloadObj.toJSONString()); } /** * appId是否被其他工位使用,如果使用返回使用的工位数据 * @param appId * @param workstationId * @return 使用该appId的工位 */ Workstation appIdUsingWorkstation(String appId,long workstationId) { //long cnt = baseMapper.selectCount(Wrappers.lambdaQuery().ne(WorkstationDatapoints::getWorkstationId, workstationId).eq(WorkstationDatapoints::getAppId, appId)); //return cnt > 0; List dpList = baseMapper.selectList(Wrappers.lambdaQuery().ne(WorkstationDatapoints::getWorkstationId, workstationId).eq(WorkstationDatapoints::getAppId, appId)); if(dpList.isEmpty()) { return null; } Workstation ws = workstationMapper.selectById(dpList.get(0).getWorkstationId()); return ws; } /** * 获取工位数据点配置 * @param workstationId * @return */ public WorkstationDatapointsVO getDatapoints(Long workstationId) { log.info("woid={}",workstationId); WorkstationDatapoints dp = baseMapper.selectOne(Wrappers.lambdaQuery().eq(WorkstationDatapoints::getWorkstationId, workstationId)); log.info("dp={}",dp); WorkstationDatapointsVO dpVO = new WorkstationDatapointsVO(); dpVO.setWorkstationId(workstationId); if(dp != null) { dpVO.setDpConfig(dp.getDpConfig()); dpVO.setType(dp.getType()); dpVO.setAppId(dp.getAppId()); Charset utf8charset = Charset.forName("utf8"); String startJsonStr= "[]"; String endJsonStr = "[]"; try { startJsonStr = IOUtils.resourceToString("/dp/dpstart.json", utf8charset); endJsonStr = IOUtils.resourceToString("/dp/dpend.json", utf8charset); } catch (IOException e) { log.error("读取默认dpHead异常",e); } CollectDeviceType collectType = typeMapper.selectById(dp.getType()); String fullHead = CollectDeviceTypeService.mergeJson(startJsonStr,collectType.getDpHead(),endJsonStr); dpVO.setDpHead(fullHead); } return dpVO; } /** * 删除工位的采集数据点位配置 * @param workstationId */ public void removeByWorkstation(List workstationIds) { log.info("删除工位数据点配置,workstationIds",workstationIds); baseMapper.delete(Wrappers.lambdaQuery().in(WorkstationDatapoints::getWorkstationId, workstationIds)); } }