From 6dccafc9990e7f6cf4d06a1a4fdae501dc1cc979 Mon Sep 17 00:00:00 2001 From: "JinLu.Yin" <411641505@qq.com> Date: Wed, 11 May 2022 23:23:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E8=A3=85=E5=A4=B9=E5=85=B7=E5=8F=B0?= =?UTF-8?q?=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ktg/common/constant/UserConstants.java | 5 + .../mes/tm/controller/TmToolController.java | 131 ++++++++ .../tm/controller/TmToolTypeController.java | 9 + .../java/com/ktg/mes/tm/domain/TmTool.java | 293 ++++++++++++++++++ .../com/ktg/mes/tm/mapper/TmToolMapper.java | 63 ++++ .../ktg/mes/tm/service/ITmToolService.java | 63 ++++ .../tm/service/impl/TmToolServiceImpl.java | 111 +++++++ .../main/resources/mapper/tm/TmToolMapper.xml | 164 ++++++++++ 8 files changed, 839 insertions(+) create mode 100644 ktg-mes/src/main/java/com/ktg/mes/tm/controller/TmToolController.java create mode 100644 ktg-mes/src/main/java/com/ktg/mes/tm/domain/TmTool.java create mode 100644 ktg-mes/src/main/java/com/ktg/mes/tm/mapper/TmToolMapper.java create mode 100644 ktg-mes/src/main/java/com/ktg/mes/tm/service/ITmToolService.java create mode 100644 ktg-mes/src/main/java/com/ktg/mes/tm/service/impl/TmToolServiceImpl.java create mode 100644 ktg-mes/src/main/resources/mapper/tm/TmToolMapper.xml diff --git a/ktg-common/src/main/java/com/ktg/common/constant/UserConstants.java b/ktg-common/src/main/java/com/ktg/common/constant/UserConstants.java index 04ee94a..ad3f3fc 100644 --- a/ktg-common/src/main/java/com/ktg/common/constant/UserConstants.java +++ b/ktg-common/src/main/java/com/ktg/common/constant/UserConstants.java @@ -83,4 +83,9 @@ public class UserConstants public static final String ITEM_CODE ="ITEM_CODE"; public static final String MACHINERY_TYPE_CODE="MACHINERY_TYPE_CODE"; + /** + * 维护类型 + */ + public static final String MAINTEN_TYPE_REGULAR="REGULAR"; + public static final String MAINTEN_TYPE_USAGE="USAGE"; } diff --git a/ktg-mes/src/main/java/com/ktg/mes/tm/controller/TmToolController.java b/ktg-mes/src/main/java/com/ktg/mes/tm/controller/TmToolController.java new file mode 100644 index 0000000..19e1d6d --- /dev/null +++ b/ktg-mes/src/main/java/com/ktg/mes/tm/controller/TmToolController.java @@ -0,0 +1,131 @@ +package com.ktg.mes.tm.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ktg.common.constant.UserConstants; +import com.ktg.mes.tm.domain.TmToolType; +import com.ktg.mes.tm.service.ITmToolTypeService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ktg.common.annotation.Log; +import com.ktg.common.core.controller.BaseController; +import com.ktg.common.core.domain.AjaxResult; +import com.ktg.common.enums.BusinessType; +import com.ktg.mes.tm.domain.TmTool; +import com.ktg.mes.tm.service.ITmToolService; +import com.ktg.common.utils.poi.ExcelUtil; +import com.ktg.common.core.page.TableDataInfo; + +/** + * 工装夹具清单Controller + * + * @author yinjinlu + * @date 2022-05-11 + */ +@RestController +@RequestMapping("/mes/tm/tool") +public class TmToolController extends BaseController +{ + @Autowired + private ITmToolService tmToolService; + + @Autowired + private ITmToolTypeService tmToolTypeService; + + /** + * 查询工装夹具清单列表 + */ + @PreAuthorize("@ss.hasPermi('mes:tm:tool:list')") + @GetMapping("/list") + public TableDataInfo list(TmTool tmTool) + { + startPage(); + List list = tmToolService.selectTmToolList(tmTool); + return getDataTable(list); + } + + /** + * 导出工装夹具清单列表 + */ + @PreAuthorize("@ss.hasPermi('mes:tm:tool:export')") + @Log(title = "工装夹具清单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TmTool tmTool) + { + List list = tmToolService.selectTmToolList(tmTool); + ExcelUtil util = new ExcelUtil(TmTool.class); + util.exportExcel(response, list, "工装夹具清单数据"); + } + + /** + * 获取工装夹具清单详细信息 + */ + @PreAuthorize("@ss.hasPermi('mes:tm:tool:query')") + @GetMapping(value = "/{toolId}") + public AjaxResult getInfo(@PathVariable("toolId") Long toolId) + { + return AjaxResult.success(tmToolService.selectTmToolByToolId(toolId)); + } + + /** + * 新增工装夹具清单 + */ + @PreAuthorize("@ss.hasPermi('mes:tm:tool:add')") + @Log(title = "工装夹具清单", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TmTool tmTool) + { + if(UserConstants.NOT_UNIQUE.equals(tmToolService.checkToolCodeUnique(tmTool))){ + return AjaxResult.error("此工装夹具编码已存在!"); + } + + TmToolType type = tmToolTypeService.selectTmToolTypeByToolTypeId(tmTool.getToolTypeId()); + tmTool.setToolTypeCode(type.getToolTypeCode()); + tmTool.setToolTypeName(type.getToolTypeName()); + tmTool.setCodeFlag(type.getCodeFlag()); + return toAjax(tmToolService.insertTmTool(tmTool)); + } + + /** + * 修改工装夹具清单 + */ + @PreAuthorize("@ss.hasPermi('mes:tm:tool:edit')") + @Log(title = "工装夹具清单", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TmTool tmTool) + { + if(UserConstants.NOT_UNIQUE.equals(tmToolService.checkToolCodeUnique(tmTool))){ + return AjaxResult.error("此工装夹具编码已存在!"); + } + TmToolType type = tmToolTypeService.selectTmToolTypeByToolTypeId(tmTool.getToolTypeId()); + tmTool.setToolTypeCode(type.getToolTypeCode()); + tmTool.setToolTypeName(type.getToolTypeName()); + tmTool.setCodeFlag(type.getCodeFlag()); + if(UserConstants.MAINTEN_TYPE_REGULAR.equals(tmTool.getMaintenType())){ + tmTool.setNextMaintenPeriod(null); + }else{ + tmTool.setNextMaintenDate(null); + } + return toAjax(tmToolService.updateTmTool(tmTool)); + } + + /** + * 删除工装夹具清单 + */ + @PreAuthorize("@ss.hasPermi('mes:tm:tool:remove')") + @Log(title = "工装夹具清单", businessType = BusinessType.DELETE) + @DeleteMapping("/{toolIds}") + public AjaxResult remove(@PathVariable Long[] toolIds) + { + return toAjax(tmToolService.deleteTmToolByToolIds(toolIds)); + } +} diff --git a/ktg-mes/src/main/java/com/ktg/mes/tm/controller/TmToolTypeController.java b/ktg-mes/src/main/java/com/ktg/mes/tm/controller/TmToolTypeController.java index 1501f21..1717bb9 100644 --- a/ktg-mes/src/main/java/com/ktg/mes/tm/controller/TmToolTypeController.java +++ b/ktg-mes/src/main/java/com/ktg/mes/tm/controller/TmToolTypeController.java @@ -48,6 +48,15 @@ public class TmToolTypeController extends BaseController return getDataTable(list); } + @PreAuthorize("@ss.hasPermi('mes:tm:tooltype:list')") + @GetMapping("/listAll") + public AjaxResult listAll(){ + TmToolType tmToolType = new TmToolType(); + List list = tmToolTypeService.selectTmToolTypeList(tmToolType); + return AjaxResult.success(list); + } + + /** * 导出工装夹具类型列表 */ diff --git a/ktg-mes/src/main/java/com/ktg/mes/tm/domain/TmTool.java b/ktg-mes/src/main/java/com/ktg/mes/tm/domain/TmTool.java new file mode 100644 index 0000000..62e1fe7 --- /dev/null +++ b/ktg-mes/src/main/java/com/ktg/mes/tm/domain/TmTool.java @@ -0,0 +1,293 @@ +package com.ktg.mes.tm.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ktg.common.annotation.Excel; +import com.ktg.common.core.domain.BaseEntity; + +/** + * 工装夹具清单对象 tm_tool + * + * @author yinjinlu + * @date 2022-05-11 + */ +public class TmTool extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 工装夹具ID */ + private Long toolId; + + /** 工装夹具编码 */ + @Excel(name = "工装夹具编码") + private String toolCode; + + /** 工装夹具名称 */ + @Excel(name = "工装夹具名称") + private String toolName; + + /** 品牌 */ + @Excel(name = "品牌") + private String brand; + + /** 型号 */ + @Excel(name = "型号") + private String spec; + + /** 工装夹具类型ID */ + @Excel(name = "工装夹具类型ID") + private Long toolTypeId; + + /** 工装夹具类型编码 */ + @Excel(name = "工装夹具类型编码") + private String toolTypeCode; + + /** 工装夹具类型名称 */ + @Excel(name = "工装夹具类型名称") + private String toolTypeName; + + /** 是否单独编码管理 */ + @Excel(name = "是否单独编码管理") + private String codeFlag; + + /** 数量 */ + @Excel(name = "数量") + private Long quantity; + + /** 可用数量 */ + @Excel(name = "可用数量") + private Long quantityAvail; + + /** 保养维护类型 */ + @Excel(name = "保养维护类型") + private String maintenType; + + /** 下一次保养周期 */ + @Excel(name = "下一次保养周期") + private Long nextMaintenPeriod; + + /** 下一次保养日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "下一次保养日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date nextMaintenDate; + + /** 状态 */ + @Excel(name = "状态") + private String status; + + /** 预留字段1 */ + private String attr1; + + /** 预留字段2 */ + private String attr2; + + /** 预留字段3 */ + private Long attr3; + + /** 预留字段4 */ + private Long attr4; + + public void setToolId(Long toolId) + { + this.toolId = toolId; + } + + public Long getToolId() + { + return toolId; + } + public void setToolCode(String toolCode) + { + this.toolCode = toolCode; + } + + public String getToolCode() + { + return toolCode; + } + public void setToolName(String toolName) + { + this.toolName = toolName; + } + + public String getToolName() + { + return toolName; + } + public void setBrand(String brand) + { + this.brand = brand; + } + + public String getBrand() + { + return brand; + } + public void setSpec(String spec) + { + this.spec = spec; + } + + public String getSpec() + { + return spec; + } + public void setToolTypeId(Long toolTypeId) + { + this.toolTypeId = toolTypeId; + } + + public Long getToolTypeId() + { + return toolTypeId; + } + public void setToolTypeCode(String toolTypeCode) + { + this.toolTypeCode = toolTypeCode; + } + + public String getToolTypeCode() + { + return toolTypeCode; + } + public void setToolTypeName(String toolTypeName) + { + this.toolTypeName = toolTypeName; + } + + public String getToolTypeName() + { + return toolTypeName; + } + public void setCodeFlag(String codeFlag) + { + this.codeFlag = codeFlag; + } + + public String getCodeFlag() + { + return codeFlag; + } + public void setQuantity(Long quantity) + { + this.quantity = quantity; + } + + public Long getQuantity() + { + return quantity; + } + public void setQuantityAvail(Long quantityAvail) + { + this.quantityAvail = quantityAvail; + } + + public Long getQuantityAvail() + { + return quantityAvail; + } + public void setMaintenType(String maintenType) + { + this.maintenType = maintenType; + } + + public String getMaintenType() + { + return maintenType; + } + public void setNextMaintenPeriod(Long nextMaintenPeriod) + { + this.nextMaintenPeriod = nextMaintenPeriod; + } + + public Long getNextMaintenPeriod() + { + return nextMaintenPeriod; + } + public void setNextMaintenDate(Date nextMaintenDate) + { + this.nextMaintenDate = nextMaintenDate; + } + + public Date getNextMaintenDate() + { + return nextMaintenDate; + } + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + public void setAttr1(String attr1) + { + this.attr1 = attr1; + } + + public String getAttr1() + { + return attr1; + } + public void setAttr2(String attr2) + { + this.attr2 = attr2; + } + + public String getAttr2() + { + return attr2; + } + public void setAttr3(Long attr3) + { + this.attr3 = attr3; + } + + public Long getAttr3() + { + return attr3; + } + public void setAttr4(Long attr4) + { + this.attr4 = attr4; + } + + public Long getAttr4() + { + return attr4; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("toolId", getToolId()) + .append("toolCode", getToolCode()) + .append("toolName", getToolName()) + .append("brand", getBrand()) + .append("spec", getSpec()) + .append("toolTypeId", getToolTypeId()) + .append("toolTypeCode", getToolTypeCode()) + .append("toolTypeName", getToolTypeName()) + .append("codeFlag", getCodeFlag()) + .append("quantity", getQuantity()) + .append("quantityAvail", getQuantityAvail()) + .append("maintenType", getMaintenType()) + .append("nextMaintenPeriod", getNextMaintenPeriod()) + .append("nextMaintenDate", getNextMaintenDate()) + .append("status", getStatus()) + .append("remark", getRemark()) + .append("attr1", getAttr1()) + .append("attr2", getAttr2()) + .append("attr3", getAttr3()) + .append("attr4", getAttr4()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/ktg-mes/src/main/java/com/ktg/mes/tm/mapper/TmToolMapper.java b/ktg-mes/src/main/java/com/ktg/mes/tm/mapper/TmToolMapper.java new file mode 100644 index 0000000..5d8c2a6 --- /dev/null +++ b/ktg-mes/src/main/java/com/ktg/mes/tm/mapper/TmToolMapper.java @@ -0,0 +1,63 @@ +package com.ktg.mes.tm.mapper; + +import java.util.List; +import com.ktg.mes.tm.domain.TmTool; + +/** + * 工装夹具清单Mapper接口 + * + * @author yinjinlu + * @date 2022-05-11 + */ +public interface TmToolMapper +{ + /** + * 查询工装夹具清单 + * + * @param toolId 工装夹具清单主键 + * @return 工装夹具清单 + */ + public TmTool selectTmToolByToolId(Long toolId); + + /** + * 查询工装夹具清单列表 + * + * @param tmTool 工装夹具清单 + * @return 工装夹具清单集合 + */ + public List selectTmToolList(TmTool tmTool); + + public TmTool checkToolCodeUnique(TmTool tmTool); + + /** + * 新增工装夹具清单 + * + * @param tmTool 工装夹具清单 + * @return 结果 + */ + public int insertTmTool(TmTool tmTool); + + /** + * 修改工装夹具清单 + * + * @param tmTool 工装夹具清单 + * @return 结果 + */ + public int updateTmTool(TmTool tmTool); + + /** + * 删除工装夹具清单 + * + * @param toolId 工装夹具清单主键 + * @return 结果 + */ + public int deleteTmToolByToolId(Long toolId); + + /** + * 批量删除工装夹具清单 + * + * @param toolIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTmToolByToolIds(Long[] toolIds); +} diff --git a/ktg-mes/src/main/java/com/ktg/mes/tm/service/ITmToolService.java b/ktg-mes/src/main/java/com/ktg/mes/tm/service/ITmToolService.java new file mode 100644 index 0000000..8b64c18 --- /dev/null +++ b/ktg-mes/src/main/java/com/ktg/mes/tm/service/ITmToolService.java @@ -0,0 +1,63 @@ +package com.ktg.mes.tm.service; + +import java.util.List; +import com.ktg.mes.tm.domain.TmTool; + +/** + * 工装夹具清单Service接口 + * + * @author yinjinlu + * @date 2022-05-11 + */ +public interface ITmToolService +{ + /** + * 查询工装夹具清单 + * + * @param toolId 工装夹具清单主键 + * @return 工装夹具清单 + */ + public TmTool selectTmToolByToolId(Long toolId); + + /** + * 查询工装夹具清单列表 + * + * @param tmTool 工装夹具清单 + * @return 工装夹具清单集合 + */ + public List selectTmToolList(TmTool tmTool); + + public String checkToolCodeUnique(TmTool tmTool); + + /** + * 新增工装夹具清单 + * + * @param tmTool 工装夹具清单 + * @return 结果 + */ + public int insertTmTool(TmTool tmTool); + + /** + * 修改工装夹具清单 + * + * @param tmTool 工装夹具清单 + * @return 结果 + */ + public int updateTmTool(TmTool tmTool); + + /** + * 批量删除工装夹具清单 + * + * @param toolIds 需要删除的工装夹具清单主键集合 + * @return 结果 + */ + public int deleteTmToolByToolIds(Long[] toolIds); + + /** + * 删除工装夹具清单信息 + * + * @param toolId 工装夹具清单主键 + * @return 结果 + */ + public int deleteTmToolByToolId(Long toolId); +} diff --git a/ktg-mes/src/main/java/com/ktg/mes/tm/service/impl/TmToolServiceImpl.java b/ktg-mes/src/main/java/com/ktg/mes/tm/service/impl/TmToolServiceImpl.java new file mode 100644 index 0000000..a9eef29 --- /dev/null +++ b/ktg-mes/src/main/java/com/ktg/mes/tm/service/impl/TmToolServiceImpl.java @@ -0,0 +1,111 @@ +package com.ktg.mes.tm.service.impl; + +import java.util.List; + +import com.ktg.common.constant.UserConstants; +import com.ktg.common.utils.DateUtils; +import com.ktg.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ktg.mes.tm.mapper.TmToolMapper; +import com.ktg.mes.tm.domain.TmTool; +import com.ktg.mes.tm.service.ITmToolService; + +/** + * 工装夹具清单Service业务层处理 + * + * @author yinjinlu + * @date 2022-05-11 + */ +@Service +public class TmToolServiceImpl implements ITmToolService +{ + @Autowired + private TmToolMapper tmToolMapper; + + /** + * 查询工装夹具清单 + * + * @param toolId 工装夹具清单主键 + * @return 工装夹具清单 + */ + @Override + public TmTool selectTmToolByToolId(Long toolId) + { + return tmToolMapper.selectTmToolByToolId(toolId); + } + + /** + * 查询工装夹具清单列表 + * + * @param tmTool 工装夹具清单 + * @return 工装夹具清单 + */ + @Override + public List selectTmToolList(TmTool tmTool) + { + return tmToolMapper.selectTmToolList(tmTool); + } + + @Override + public String checkToolCodeUnique(TmTool tmTool) { + if(StringUtils.isNotNull(tmTool.getToolCode())){ + TmTool tool = tmToolMapper.checkToolCodeUnique(tmTool); + Long toolId = tmTool.getToolId()==null?-1L:tmTool.getToolId(); + if(StringUtils.isNotNull(tool) && tool.getToolId().longValue()!=toolId.longValue()){ + return UserConstants.NOT_UNIQUE; + } + } + return UserConstants.UNIQUE; + } + + /** + * 新增工装夹具清单 + * + * @param tmTool 工装夹具清单 + * @return 结果 + */ + @Override + public int insertTmTool(TmTool tmTool) + { + tmTool.setCreateTime(DateUtils.getNowDate()); + return tmToolMapper.insertTmTool(tmTool); + } + + /** + * 修改工装夹具清单 + * + * @param tmTool 工装夹具清单 + * @return 结果 + */ + @Override + public int updateTmTool(TmTool tmTool) + { + tmTool.setUpdateTime(DateUtils.getNowDate()); + return tmToolMapper.updateTmTool(tmTool); + } + + /** + * 批量删除工装夹具清单 + * + * @param toolIds 需要删除的工装夹具清单主键 + * @return 结果 + */ + @Override + public int deleteTmToolByToolIds(Long[] toolIds) + { + return tmToolMapper.deleteTmToolByToolIds(toolIds); + } + + /** + * 删除工装夹具清单信息 + * + * @param toolId 工装夹具清单主键 + * @return 结果 + */ + @Override + public int deleteTmToolByToolId(Long toolId) + { + return tmToolMapper.deleteTmToolByToolId(toolId); + } +} diff --git a/ktg-mes/src/main/resources/mapper/tm/TmToolMapper.xml b/ktg-mes/src/main/resources/mapper/tm/TmToolMapper.xml new file mode 100644 index 0000000..4a33eb9 --- /dev/null +++ b/ktg-mes/src/main/resources/mapper/tm/TmToolMapper.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select tool_id, tool_code, tool_name, brand, spec, tool_type_id, tool_type_code, tool_type_name, code_flag, quantity, quantity_avail, mainten_type, next_mainten_period, next_mainten_date, status, remark, attr1, attr2, attr3, attr4, create_by, create_time, update_by, update_time from tm_tool + + + + + + + + + + insert into tm_tool + + tool_code, + tool_name, + brand, + spec, + tool_type_id, + tool_type_code, + tool_type_name, + code_flag, + quantity, + quantity_avail, + mainten_type, + next_mainten_period, + next_mainten_date, + status, + remark, + attr1, + attr2, + attr3, + attr4, + create_by, + create_time, + update_by, + update_time, + + + #{toolCode}, + #{toolName}, + #{brand}, + #{spec}, + #{toolTypeId}, + #{toolTypeCode}, + #{toolTypeName}, + #{codeFlag}, + #{quantity}, + #{quantityAvail}, + #{maintenType}, + #{nextMaintenPeriod}, + #{nextMaintenDate}, + #{status}, + #{remark}, + #{attr1}, + #{attr2}, + #{attr3}, + #{attr4}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + + + + + update tm_tool + + tool_code = #{toolCode}, + tool_name = #{toolName}, + brand = #{brand}, + spec = #{spec}, + tool_type_id = #{toolTypeId}, + tool_type_code = #{toolTypeCode}, + tool_type_name = #{toolTypeName}, + code_flag = #{codeFlag}, + quantity = #{quantity}, + quantity_avail = #{quantityAvail}, + mainten_type = #{maintenType}, + next_mainten_period = #{nextMaintenPeriod}, + next_mainten_date = #{nextMaintenDate}, + next_mainten_period = null, + next_mainten_date = null, + status = #{status}, + remark = #{remark}, + attr1 = #{attr1}, + attr2 = #{attr2}, + attr3 = #{attr3}, + attr4 = #{attr4}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + where tool_id = #{toolId} + + + + delete from tm_tool where tool_id = #{toolId} + + + + delete from tm_tool where tool_id in + + #{toolId} + + + \ No newline at end of file