package com.ots.project.exam.controller; import com.ots.common.constant.UserConstants; import com.ots.common.enums.SenderType; import com.ots.common.enums.TestPackageStatusEnum; import com.ots.common.enums.UserTypeEnum; import com.ots.common.utils.MessageUtils; import com.ots.common.utils.StringUtils; import com.ots.common.utils.poi.ExcelUtil; import com.ots.common.utils.security.ShiroUtils; import com.ots.framework.aspectj.lang.annotation.Log; import com.ots.framework.aspectj.lang.enums.BusinessType; import com.ots.framework.config.VueConfig; import com.ots.framework.web.controller.BaseController; import com.ots.framework.web.domain.AjaxResult; import com.ots.framework.web.page.TableDataInfo; import com.ots.project.exam.domain.*; import com.ots.project.exam.dto.SendTask; import com.ots.project.exam.service.*; import com.ots.project.system.user.domain.User; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import static com.ots.common.enums.UserTypeEnum.SYS_USER; /** * 批量导入测试人员名单Controller * * @author Shawn * @date 2019-11-22 */ @Controller @RequestMapping("/exam/testMember") @Slf4j public class EntTestMemberController extends BaseController { private String prefix = "exam/testMember"; @Autowired private IEntTestMemberService entTestMemberService; @Autowired private IEntTestPackageService entTestPackageService; @Autowired private IEntTestSendtaskService iEntTestSendtaskService; @Autowired private ISysUserExtendService sysUserExtendService; @Autowired private ITExamPaperService itExamPaperService; @Autowired private VueConfig vueConfig; @RequiresPermissions("exam:testMember:view") @GetMapping() public String testMember(ModelMap mmap) { memberParam(null, mmap); return prefix + "/testMember"; } @GetMapping("/memberQuery") public String testMemberQuery(String queryType, String queryValue, ModelMap mmap) { memberParam(null, mmap); if (Objects.nonNull(queryType)) { if (Objects.nonNull(queryValue)) { if (Objects.equals("2", queryType)) {//按姓名搜索测试用户 mmap.put("memberNameSend", queryValue); } else if (Objects.equals("3", queryType)) {//按邮箱搜索测试用户 mmap.put("memberEmailSend", queryValue); } else if (Objects.equals("4", queryType)) {//按手机号码搜索测试用户 mmap.put("memberPhoneSend", queryValue); } else if (Objects.equals("5", queryType)) {//按密码搜索测试用户 mmap.put("tokenSend", queryValue); } } } return prefix + "/testMemberQuery"; } @GetMapping("/memberDetailVerify/{testId}") @ResponseBody public AjaxResult memberDetailVerify(@PathVariable Long testId) { EntTestPackage entTestPackage = entTestPackageService.selectEntTestPackageById(testId); TExamPaper tExamPaper = itExamPaperService.selectTExamPaperById(entTestPackage.getProdId()); if (Objects.isNull(tExamPaper)) { // 无效的产品包,请重新选择测试包的产品包 return AjaxResult.error(MessageUtils.message("jsp.exam.member.invalidProductPackage")); } return AjaxResult.success(); } /** * 查询评测人员详情 */ @GetMapping("/memberDetail/{testId}") public String testMemberDetail(@PathVariable Long testId, ModelMap mmap) { memberParam(testId, mmap); return prefix + "/testMember"; } public void memberParam(Long testId, ModelMap mmap) { User sysUser = ShiroUtils.getSysUser(); Long userId = sysUser.getUserId(); if (Objects.equals(sysUser.getUserType(), UserConstants.SYS_USER)) { userId = null; } EntTestPackage value = new EntTestPackage(); if (Objects.nonNull(testId)) { value = entTestPackageService.selectEntTestPackageById(testId); } mmap.put("testpkg", value); mmap.put("packageTestId", testId); mmap.put("packageTestName", value.getTestName()); String[] status = {TestPackageStatusEnum.enable.getCode(), TestPackageStatusEnum.pause.getCode(), TestPackageStatusEnum.ending.getCode(), TestPackageStatusEnum.invalid.getCode()}; mmap.put("testPackages", entTestPackageService.selectEntTestPackageListByIdAndStatusIn(userId, Arrays.asList(status))); } /** * 查询批量导入测试人员名单列表 */ @RequiresPermissions("exam:testMember:list") @PostMapping("/list") @ResponseBody public TableDataInfo list(EntTestMember entTestMember) { startPage(); String queryValue = entTestMember.getQueryValue(); if (StringUtils.isNotBlank(queryValue)) { String queryType = entTestMember.getQueryType(); if (Objects.equals("2", queryType)) { entTestMember.setMemberName(queryValue); } else if (Objects.equals("3", queryType)) { entTestMember.setMemberEmail(queryValue); } else if (Objects.equals("4", queryType)) { entTestMember.setMemberPhone(queryValue); } else if (Objects.equals("5", queryType)) { entTestMember.setToken(queryValue); } } List list = entTestMemberService.selectEntTestMemberList(entTestMember); return getDataTable(list); } @PostMapping("/listTopAnswering") @ResponseBody public TableDataInfo listTopAnswering(EntTestMember entTestMember) { startPage(); User sysUser = ShiroUtils.getSysUser(); if (!SYS_USER.getUserType().equals(sysUser.getUserType())) { entTestMember.setUserId(sysUser.getUserId()); } return getDataTable(entTestMemberService.selectEntTestMemberTopList(entTestMember)); } @PostMapping("/queryList") @ResponseBody public TableDataInfo queryList(EntTestMember entTestMember) { startPage(); User sysUser = ShiroUtils.getSysUser(); String userType = sysUser.getUserType(); List userIds = new ArrayList<>(); userIds.add(sysUser.getUserId()); //分销商可以看到分销商下的企业信息 if (UserTypeEnum.DIS_USER.getUserType().equals(userType)) { SysUserExtend sysUserExtend = new SysUserExtend(); sysUserExtend.setParentUserId(sysUser.getUserId()); List sysUserExtends = sysUserExtendService.selectSysUserExtendList(sysUserExtend); for (int i = 0; i < sysUserExtends.size(); i++) { SysUserExtend extend = sysUserExtends.get(i); userIds.add(extend.getUserId()); } } List list; if (!SYS_USER.getUserType().equals(userType)) { entTestMember.setUserList(userIds); } list = entTestMemberService.selectEntTestMemberQueryList(entTestMember); return getDataTable(list); } /** * 导出批量导入测试人员名单列表 */ @RequiresPermissions("exam:testMember:export") @PostMapping("/export") @ResponseBody public AjaxResult export(EntTestMember entTestMember) { List list = entTestMemberService.selectEntTestMemberList(entTestMember); ExcelUtil util = new ExcelUtil(EntTestMember.class); return util.exportExcel(list, "测试用户链接(Test Taker URLs)"); } /** * 一键导出测试包里所有成员的测试连接 */ @RequiresPermissions("exam:testMember:export") @PostMapping("/exportLinkTest") @ResponseBody public AjaxResult exportLinkTest(EntTestMember entTestMember) { List list = entTestMemberService.selectEntTestMemberList(entTestMember); String url = vueConfig.getUrl(); List collect = list.stream().map(item -> { String token = item.getToken(); String urlNew = MessageFormat.format(url, token); EntTestMemberOther entTestMemberOther = new EntTestMemberOther(); entTestMemberOther.setMemberName(item.getMemberName()); entTestMemberOther.setTestUrl(urlNew); return entTestMemberOther; }).collect(Collectors.toList()); ExcelUtil util = new ExcelUtil<>(EntTestMemberOther.class); return util.exportExcel(collect, "测试用户链接(Test Taker URLs)"); } /** * 新增批量导入测试人员名单 */ @RequiresPermissions("exam:testMember:batchimport") @GetMapping("/add/{testId}") public String add(@PathVariable Long testId, ModelMap mmap) { EntTestPackage value = new EntTestPackage(); if (Objects.nonNull(testId)) { value = entTestPackageService.selectEntTestPackageById(testId); } mmap.put("testpkg", value); return prefix + "/add"; } /** * 新增保存批量导入测试人员名单 */ @RequiresPermissions("exam:testMember:add") @Log(title = "批量导入测试人员名单", businessType = BusinessType.INSERT) @PostMapping("/add") @ResponseBody public AjaxResult addSave(EntTestMember entTestMember) { return toAjax(entTestMemberService.insertEntTestMember(entTestMember)); } /** * 新增邀请用户邮件发送列表 */ @RequiresPermissions("exam:testMember:add") @Log(title = "记录邀请用户发送列表", businessType = BusinessType.INSERT) @PostMapping("/addSendTask") @ResponseBody public AjaxResult addSaveEmail(SendTask sendTask) { return toAjax(iEntTestSendtaskService.insertEntTestSendtaskFromMemberIds(sendTask)); } /** * 修改批量导入测试人员名单 */ @GetMapping("/edit/{memberId}") public String edit(@PathVariable("memberId") Long memberId, ModelMap mmap) { EntTestMember entTestMember = entTestMemberService.selectEntTestMemberById(memberId); mmap.put("entTestMember", entTestMember); return prefix + "/edit"; } @GetMapping("/send/sendSms/{memberIds}/{testId}") public String sendSms(@PathVariable("memberIds") String memberIds, @PathVariable("testId") Long testId, ModelMap mmap) { StringBuilder builder = new StringBuilder(); builder.append("亲爱的{FullName},").append("\n"); builder.append("\n"); builder.append("{Company} 邀请您完成一份测试,大概需要20-25分钟时间。您可以直接点击下面的链接开始该测试。如果不能直接访问,请复制地址到浏览器中直接打开。").append("\n"); builder.append("\n"); builder.append("链接地址是:{url}"); builder.append("\n"); builder.append("如有疑问,请与客服联系,邮箱是:support@tai-online.com。"); builder.append("\n"); builder.append("谢谢!").append("\n"); builder.append("{Company}"); String type = SenderType.sms.getType(); processParams(memberIds, testId, mmap, builder.toString(), type); return prefix + "/sendSms"; } @GetMapping("/send/sendEmail/{memberIds}/{testId}") public String sendEmail(@PathVariable("memberIds") String memberIds, @PathVariable("testId") Long testId, ModelMap mmap) { // String defaultTemplate = "欢迎您参加“工作行为问卷!”链接地址: {url}\n如果不能直接访问,请复制地址到浏览器中直接打开。如有疑问,请和XX联系。"; String langType = LocaleContextHolder.getLocale().toString(); StringBuilder builder = new StringBuilder(); builder.append("亲爱的{FullName},").append("\n
"); builder.append("Dear {FullName},").append("\n
"); builder.append("เรียน {FullName},").append("\n
"); builder.append("\n
"); builder.append("{Company} 邀请您完成一份测试,大概需要20-25分钟时间。您可以直接点击下面的链接开始该测试。如果不能直接访问,请复制地址到浏览器中直接打开。").append("\n
"); builder.append("You've been invited to take an assessment by {Company}, which shall take about 20-25 minutes to complete. Please click the link below, or copy the link to your browser, to begin the assessment.").append("\n
"); builder.append("คุณได้รับเชิญให้ทำแบบประเมินจาก {Company} กรุณาใช้ลิงค์ด้านล่างเพื่อเริ่มดำเนินการ โดยคุณสามารถคลิกที่ลิงค์ด้านล่างโดยตรง หรือจะคัดลอกแล้วนำลิงค์ไปวางบนเบราว์เซอร์ของคุณก็ได้").append("\n
"); builder.append("链接地址是:").append("\n
"); builder.append("The link is:").append("\n
"); builder.append("ตามลิงค์นี้:").append("\n
"); builder.append("{url}").append("\n
"); builder.append("\n
"); builder.append("如有疑问,请与客服联系,邮箱是:support@tai-online.com。").append("\n
"); builder.append("Should you have problem assessing the above link, please contact our customer service at support@tai-online.com.").append("\n
"); builder.append("หากคุณมีปัญหาในการเข้าสู่ลิงค์ข้างต้น โปรดติดต่อฝ่ายบริการลูกค้าของเราที่ support@tai-online.com").append("\n
"); builder.append("\n
"); builder.append("\n
"); builder.append("谢谢!").append("\n
"); builder.append("All the best,").append("\n
"); builder.append("ด้วยความเคารพ").append("\n
"); builder.append("\n
"); builder.append("{Company}").append("\n
"); String type = SenderType.email.getType(); processParams(memberIds, testId, mmap, builder.toString(), type); return prefix + "/sendEmail"; } private void processParams(@PathVariable("memberIds") String memberIds, @PathVariable("testId") Long testId, ModelMap mmap, String defaultTemplate, String type) { mmap.put("memberIds", memberIds); mmap.put("size", memberIds.split(",").length); mmap.put("type", type); EntTestPackage entTestPackage = entTestPackageService.selectEntTestPackageById(testId); String template = entTestPackage.getTemplate(); if (Objects.equals(SenderType.sms.getType(), type)) { mmap.put("template", defaultTemplate); } else { mmap.put("template", Objects.isNull(template) ? defaultTemplate : template); } mmap.put("testName", entTestPackage.getTestName() + "邀请邮件"); } /** * 修改保存批量导入测试人员名单 */ @RequiresPermissions("exam:testMember:edit") @Log(title = "批量导入测试人员名单", businessType = BusinessType.UPDATE) @PostMapping("/edit") @ResponseBody public AjaxResult editSave(EntTestMember entTestMember) { return toAjax(entTestMemberService.updateEntTestMember(entTestMember)); } /** * 删除批量导入测试人员名单 */ @RequiresPermissions("exam:testMember:remove") @Log(title = "批量导入测试人员名单", businessType = BusinessType.DELETE) @PostMapping("/remove") @ResponseBody public AjaxResult remove(String ids) { return toAjax(entTestMemberService.deleteEntTestMemberByIds(ids)); } /** * 批量导入测试人员名单 */ // @RequiresPermissions("enterprise:testMember:import") @PostMapping("/importData/{testId}") @ResponseBody public AjaxResult importData(MultipartFile file, boolean updateSupport, @PathVariable Long testId) throws Exception { ExcelUtil util = new ExcelUtil<>(EntTestMember.class); List entTestMemberList = util.importExcel(file.getInputStream()); for (EntTestMember member : entTestMemberList) { member.setTestId(testId); } String message = entTestMemberService.importEntTestMember(entTestMemberList, updateSupport); return AjaxResult.success(message); } /** * 批量导入测试人员名单模板下载 */ @GetMapping("/importTemplate") @ResponseBody public AjaxResult importTemplate() { ExcelUtil util = new ExcelUtil(EntTestMember.class); return util.importTemplateExcel("测试用户(Test-Takers)"); } }