diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/entity/EmpUser.java b/modules/core/src/main/java/com/jeesite/modules/sys/entity/EmpUser.java index f9fdd711..372fa04f 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/entity/EmpUser.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/entity/EmpUser.java @@ -85,16 +85,7 @@ public class EmpUser extends User { private static final long serialVersionUID = 1L; private String[] codes; // 查询用 - - public EmpUser() { - this(null); - } - public EmpUser(String id){ - super(id); - } - - @Valid @ExcelFields({ @ExcelField(title="归属机构", attrName="employee.office", align=Align.CENTER, sort=10, fieldType=OfficeType.class), @ExcelField(title="归属公司", attrName="employee.company", align = Align.CENTER, sort=20, fieldType=CompanyType.class), @@ -110,6 +101,15 @@ public class EmpUser extends User { @ExcelField(title="建档日期", attrName="createDate", align=Align.CENTER, words=15, sort=900, type=ExcelField.Type.EXPORT, dataFormat="yyyy-MM-dd"), @ExcelField(title="最后登录", attrName="lastLoginDate", align=Align.CENTER, words=20, sort=900, type=ExcelField.Type.EXPORT), }) + public EmpUser() { + this(null); + } + + public EmpUser(String id){ + super(id); + } + + @Valid public Employee getEmployee(){ Employee employee = super.getRefObj(); if (employee == null){ diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/entity/Office.java b/modules/core/src/main/java/com/jeesite/modules/sys/entity/Office.java index 986cf85c..512f5a41 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/entity/Office.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/entity/Office.java @@ -3,10 +3,9 @@ */ package com.jeesite.modules.sys.entity; -import javax.validation.constraints.Pattern; - -import javax.validation.constraints.Size; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; import com.fasterxml.jackson.annotation.JsonIgnore; import com.jeesite.common.entity.BaseEntity; @@ -16,6 +15,9 @@ import com.jeesite.common.entity.TreeEntity; import com.jeesite.common.mybatis.annotation.Column; import com.jeesite.common.mybatis.annotation.Table; import com.jeesite.common.mybatis.mapper.query.QueryType; +import com.jeesite.common.utils.excel.annotation.ExcelField; +import com.jeesite.common.utils.excel.annotation.ExcelField.Align; +import com.jeesite.common.utils.excel.annotation.ExcelFields; import com.jeesite.modules.sys.utils.EmpUtils; /** @@ -38,7 +40,7 @@ import com.jeesite.modules.sys.utils.EmpUtils; @Column(name="zip_code", attrName="zipCode", label="邮政编码", queryType=QueryType.LIKE), @Column(name="email", attrName="email", label="邮箱", queryType=QueryType.LIKE), @Column(includeEntity=Extend.class, attrName="extend"), - }, extWhereKeys="dsf", orderBy="a.tree_sort, a.office_code" + }, extWhereKeys="dsf", orderBy="a.tree_sorts, a.office_code" ) public class Office extends TreeEntity { @@ -56,7 +58,19 @@ public class Office extends TreeEntity { private Extend extend; // 扩展字段 private String companyCode; // 根据公司查询机构,组织机构所属公司 - + + @ExcelFields({ + @ExcelField(title="上级编码", attrName="parentCode", align=Align.LEFT, sort=10), + @ExcelField(title="机构编码", attrName="officeCode", align=Align.LEFT, sort=20), + @ExcelField(title="显示编码", attrName="viewCode", align = Align.LEFT, sort=30), + @ExcelField(title="机构名称", attrName="officeName", align=Align.LEFT, sort=40), + @ExcelField(title="机构全称", attrName="fullName", align=Align.LEFT, sort=50), + @ExcelField(title="机构类型", attrName="officeType", align=Align.CENTER, sort=60, dictType="sys_office_type"), + @ExcelField(title="负责人", attrName="leader", align=Align.CENTER, sort=70), + @ExcelField(title="电话", attrName="phone", align=Align.CENTER, sort=80), + @ExcelField(title="联系地址", attrName="address", align=Align.CENTER, sort=90), + @ExcelField(title="邮箱", attrName="email", align=Align.CENTER, sort=90), + }) public Office() { this(null); } @@ -74,7 +88,7 @@ public class Office extends TreeEntity { public void setParent(Office parent) { this.parent = parent; } - + public String getOfficeCode() { return officeCode; } diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/service/OfficeService.java b/modules/core/src/main/java/com/jeesite/modules/sys/service/OfficeService.java index b9927ffe..138f15cd 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/service/OfficeService.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/service/OfficeService.java @@ -5,6 +5,8 @@ package com.jeesite.modules.sys.service; import java.util.List; +import org.springframework.web.multipart.MultipartFile; + import com.jeesite.common.service.api.TreeServiceApi; import com.jeesite.modules.sys.entity.Office; @@ -39,6 +41,13 @@ public interface OfficeService extends TreeServiceApi { @Override public void save(Office office); + /** + * 导入机构数据 + * @param file 导入的用户数据文件 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + */ + public String importData(MultipartFile file, Boolean isUpdateSupport); + /** * 更新部门状态 */ diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/service/support/OfficeServiceSupport.java b/modules/core/src/main/java/com/jeesite/modules/sys/service/support/OfficeServiceSupport.java index 43368c36..01f75972 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/service/support/OfficeServiceSupport.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/service/support/OfficeServiceSupport.java @@ -5,10 +5,18 @@ package com.jeesite.modules.sys.service.support; import java.util.List; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import com.jeesite.common.config.Global; +import com.jeesite.common.service.ServiceException; import com.jeesite.common.service.TreeService; +import com.jeesite.common.utils.excel.ExcelImport; +import com.jeesite.common.validator.ValidatorUtils; import com.jeesite.modules.sys.dao.OfficeDao; import com.jeesite.modules.sys.entity.Office; import com.jeesite.modules.sys.service.DataScopeService; @@ -69,6 +77,69 @@ public class OfficeServiceSupport extends TreeService clearOfficeCache(); } + /** + * 导入机构数据 + * @param file 导入的机构数据文件 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + */ + @Transactional(readOnly=false) + public String importData(MultipartFile file, Boolean isUpdateSupport) { + if (file == null){ + throw new ServiceException(text("请选择导入的数据文件!")); + } + int successNum = 0; int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + try(ExcelImport ei = new ExcelImport(file, 2, 0)){ + List list = ei.getDataList(Office.class); + for (Office office : list) { + try{ + // 验证数据文件 + ValidatorUtils.validateWithException(office); + // 验证是否存在这个机构 + Office e = get(office.getOfficeCode()); + if (e == null){ + office.setIsNewRecord(true); + this.save(office); + successNum++; + successMsg.append("
" + successNum + "、机构 " + office.getOfficeCode() + " 导入成功"); + } else if (isUpdateSupport){ + office.setOfficeCode(e.getOfficeCode()); + this.save(office); + successNum++; + successMsg.append("
" + successNum + "、机构 " + office.getOfficeCode() + " 更新成功"); + } else { + failureNum++; + failureMsg.append("
" + failureNum + "、机构 " + office.getOfficeCode() + " 已存在"); + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、机构 " + office.getOfficeCode() + " 导入失败:"; + if (e instanceof ConstraintViolationException){ + ConstraintViolationException cve = (ConstraintViolationException)e; + for (ConstraintViolation violation : cve.getConstraintViolations()) { + msg += Global.getText(violation.getMessage()) + " ("+violation.getPropertyPath()+")"; + } + }else{ + msg += e.getMessage(); + } + failureMsg.append(msg); + logger.error(msg, e); + } + } + } catch (Exception e) { + failureMsg.append(e.getMessage()); + logger.error(e.getMessage(), e); + } + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + }else{ + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + /** * 更新部门状态 */ diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/web/OfficeController.java b/modules/core/src/main/java/com/jeesite/modules/sys/web/OfficeController.java index 00dfb686..2e766917 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/web/OfficeController.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/web/OfficeController.java @@ -6,6 +6,8 @@ package com.jeesite.modules.sys.web; import java.util.List; import java.util.Map; +import javax.servlet.http.HttpServletResponse; + import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -16,12 +18,16 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; import com.jeesite.common.collect.ListUtils; import com.jeesite.common.collect.MapUtils; import com.jeesite.common.config.Global; import com.jeesite.common.idgen.IdGen; +import com.jeesite.common.lang.DateUtils; import com.jeesite.common.lang.StringUtils; +import com.jeesite.common.utils.excel.ExcelExport; +import com.jeesite.common.utils.excel.annotation.ExcelField.Type; import com.jeesite.common.web.BaseController; import com.jeesite.modules.sys.entity.Office; import com.jeesite.modules.sys.service.OfficeService; @@ -163,6 +169,53 @@ public class OfficeController extends BaseController { return renderResult(Global.TRUE, text("保存机构''{0}''成功", office.getOfficeName())); } + /** + * 导出机构数据 + */ + @RequiresPermissions("sys:office:view") + @RequestMapping(value = "exportData") + public void exportData(Office office, Boolean isAll, String ctrlPermi, HttpServletResponse response) { + if (!(isAll != null && isAll) || Global.isStrictMode()){ + officeService.addDataScopeFilter(office, ctrlPermi); + } + office.getSqlMap().getOrder().setOrderBy("a.tree_sorts"); + List list = officeService.findList(office); + String fileName = "机构数据" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; + try(ExcelExport ee = new ExcelExport("机构数据", Office.class)){ + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 下载导入机构数据模板 + */ + @RequiresPermissions("sys:office:view") + @RequestMapping(value = "importTemplate") + public void importTemplate(HttpServletResponse response) { + Office office = new Office(); + List list = ListUtils.newArrayList(office); + String fileName = "机构数据模板.xlsx"; + try(ExcelExport ee = new ExcelExport("机构数据", Office.class, Type.IMPORT)){ + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 导入机构数据 + */ + @ResponseBody + @RequiresPermissions("sys:office:edit") + @PostMapping(value = "importData") + public String importData(MultipartFile file, String updateSupport) { + try { + boolean isUpdateSupport = Global.YES.equals(updateSupport); + String message = officeService.importData(file, isUpdateSupport); + return renderResult(Global.TRUE, "posfull:"+message); + } catch (Exception ex) { + return renderResult(Global.FALSE, "posfull:"+ex.getMessage()); + } + } + /** * 停用机构 * @param office diff --git a/modules/core/src/main/resources/views/modules/sys/officeList.html b/modules/core/src/main/resources/views/modules/sys/officeList.html index 556a8b0a..86114e53 100644 --- a/modules/core/src/main/resources/views/modules/sys/officeList.html +++ b/modules/core/src/main/resources/views/modules/sys/officeList.html @@ -10,7 +10,9 @@ ${text('刷新')} ${text('展开')} ${text('折叠')} + ${text('导出')} <% if(hasPermi('sys:office:edit')){ %> + ${text('导入')} ${text('新增')} <% } %> @@ -104,4 +106,61 @@ $('#dataGrid').dataGrid({ } } }); - \ No newline at end of file +$('#btnExport').click(function(){ + js.ajaxSubmitForm($('#searchForm'), { + url:'${ctx}/sys/office/exportData', + downloadFile:true + }); +}); +$('#btnImport').click(function(){ + js.layer.open({ + type: 1, + area: ['400px'], + title: '${text("导入机构数据")}', + resize: false, + scrollbar: true, + content: js.template('importTpl'), + success: function(layero, index){ + layero.find('input[type="checkbox"]').iCheck(); + }, + btn: [' ${text("导入")}', + ' ${text("关闭")}'], + btn1: function(index, layero){ + var form = { + inputForm: layero.find('#inputForm'), + file: layero.find('#file').val() + }; + if (form.file == '' || (!js.endWith(form.file, '.xls') && !js.endWith(form.file, '.xlsx'))){ + js.showMessage("${text('文件不正确,请选择后缀为“xls”或“xlsx”的文件。')}", null, 'warning'); + return false; + } + js.ajaxSubmitForm(form.inputForm, function(data){ + js.showMessage(data.message); + if(data.result == Global.TRUE){ + js.layer.closeAll(); + } + page(); + }, "json"); + return true; + } + }); +}); + + \ No newline at end of file