UserController.java 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090
  1. package com.qxgmat.controller.admin;
  2. import com.github.pagehelper.Page;
  3. import com.nuliji.tools.*;
  4. import com.nuliji.tools.exception.ParameterException;
  5. import com.qxgmat.data.constants.enums.ServiceKey;
  6. import com.qxgmat.data.constants.enums.module.FeedbackModule;
  7. import com.qxgmat.data.constants.enums.module.ProductType;
  8. import com.qxgmat.data.constants.enums.status.AnswerStatus;
  9. import com.qxgmat.data.constants.enums.status.DirectionStatus;
  10. import com.qxgmat.data.constants.enums.status.FeedbackStatus;
  11. import com.qxgmat.data.constants.enums.trade.PayMethod;
  12. import com.qxgmat.data.constants.enums.trade.RecordSource;
  13. import com.qxgmat.data.constants.enums.user.MoneyRange;
  14. import com.qxgmat.data.dao.entity.*;
  15. import com.qxgmat.dto.admin.extend.*;
  16. import com.qxgmat.dto.admin.request.*;
  17. import com.qxgmat.dto.admin.response.*;
  18. import com.qxgmat.help.ShiroHelp;
  19. import com.qxgmat.service.ManagerService;
  20. import com.qxgmat.service.UserPaperService;
  21. import com.qxgmat.service.UserServiceService;
  22. import com.qxgmat.service.extend.*;
  23. import com.qxgmat.service.UsersService;
  24. import com.qxgmat.service.inline.*;
  25. import io.swagger.annotations.Api;
  26. import io.swagger.annotations.ApiOperation;
  27. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  28. import org.apache.poi.ss.usermodel.Cell;
  29. import org.apache.poi.ss.usermodel.Row;
  30. import org.apache.poi.ss.usermodel.Sheet;
  31. import org.apache.poi.ss.usermodel.Workbook;
  32. import org.slf4j.Logger;
  33. import org.slf4j.LoggerFactory;
  34. import org.springframework.beans.factory.annotation.Autowired;
  35. import org.springframework.http.MediaType;
  36. import org.springframework.validation.annotation.Validated;
  37. import org.springframework.web.bind.annotation.*;
  38. import javax.servlet.ServletOutputStream;
  39. import javax.servlet.http.HttpServletRequest;
  40. import javax.servlet.http.HttpServletResponse;
  41. import javax.servlet.http.HttpSession;
  42. import java.io.*;
  43. import java.math.BigDecimal;
  44. import java.text.SimpleDateFormat;
  45. import java.util.Collection;
  46. import java.util.Date;
  47. import java.util.List;
  48. import java.util.Map;
  49. import java.util.stream.Collectors;
  50. @RestController("AdminUserController")
  51. @RequestMapping("/admin/user")
  52. @Api(tags = "用户接口", description = "用户相关操作", produces = MediaType.APPLICATION_JSON_VALUE)
  53. public class UserController {
  54. private static final Logger logger = LoggerFactory.getLogger(UserController.class);
  55. @Autowired
  56. private ShiroHelp shiroHelp;
  57. @Autowired
  58. private ManagerLogService managerLogService;
  59. @Autowired
  60. private CourseService courseService;
  61. @Autowired
  62. private CourseNoService courseNoService;
  63. @Autowired
  64. private CourseDataService courseDataService;
  65. @Autowired
  66. private CoursePackageService coursePackageService;
  67. @Autowired
  68. private QuestionService questionService;
  69. @Autowired
  70. private QuestionNoService questionNoService;
  71. @Autowired
  72. private ReadyRoomService readyRoomService;
  73. @Autowired
  74. private UsersService usersService;
  75. @Autowired
  76. private UserServiceService userServiceService;
  77. @Autowired
  78. private UserCourseService userCourseService;
  79. @Autowired
  80. private UserPaperService userPaperService;
  81. @Autowired
  82. private UserReportService userReportService;
  83. @Autowired
  84. private UserOrderService userOrderService;
  85. @Autowired
  86. private ManagerService managerService;
  87. @Autowired
  88. private PreviewService previewService;
  89. @Autowired
  90. private PreviewPaperService previewPaperService;
  91. @Autowired
  92. private PreviewAssignService previewAssignService;
  93. @Autowired
  94. private TextbookLibraryService textbookLibraryService;
  95. @Autowired
  96. private TextbookTopicService textbookTopicService;
  97. @Autowired
  98. private UserCourseAppointmentService userCourseAppointmentService;
  99. @Autowired
  100. private UserCourseAppointmentCommentService userCourseAppointmentCommentService;
  101. @Autowired
  102. private UserFeedbackErrorService userFeedbackErrorService;
  103. @Autowired
  104. private UserTextbookFeedbackService userTextbookFeedbackService;
  105. @Autowired
  106. private UserReadyRoomFeedbackService userReadyRoomFeedbackService;
  107. @Autowired
  108. private UserOrderRecordService userOrderRecordService;
  109. @Autowired
  110. private UserOrderCheckoutService userOrderCheckoutService;
  111. @Autowired
  112. private QuestionFlowService questionFlowService;
  113. @Autowired
  114. private OrderFlowService orderFlowService;
  115. @Autowired
  116. private CourseExtendService courseExtendService;
  117. @Autowired
  118. private SentenceService sentenceService;
  119. @Autowired
  120. private UserInvoiceService userInvoiceService;
  121. @Autowired
  122. private UserAbnormalService userAbnormalService;
  123. @Autowired
  124. private UserCourseProgressService userCourseProgressService;
  125. @Autowired
  126. private UserCourseRecordService userCourseRecordService;
  127. @Autowired
  128. private MessageExtendService messageExtendService;
  129. @RequestMapping(value = "/token", method = RequestMethod.GET)
  130. @ApiOperation(value = "获取用户token", httpMethod = "GET")
  131. public Response<String> token(@RequestParam int id, HttpSession session) {
  132. User entity = usersService.get(id);
  133. String token = usersService.getTokenByUser(entity);
  134. return ResponseHelp.success(token);
  135. }
  136. @RequestMapping(value = "/add", method = RequestMethod.POST)
  137. @ApiOperation(value = "人工添加用户", httpMethod = "POST")
  138. public Response<Boolean> add(@RequestBody @Validated UserDto dto, HttpSession session) {
  139. User entity = Transform.dtoToEntity(dto);
  140. User in = usersService.getByMobile(entity.getArea(), entity.getMobile());
  141. if (in != null){
  142. throw new ParameterException("手机号已注册");
  143. }
  144. usersService.add(entity);
  145. return ResponseHelp.success(true);
  146. }
  147. @RequestMapping(value = "/detail", method = RequestMethod.GET)
  148. @ApiOperation(value = "获取用户", httpMethod = "GET")
  149. public Response<UserDetailDto> detail(@RequestParam int id, HttpSession session) {
  150. User entity = usersService.get(id);
  151. UserDetailDto dto = Transform.convert(entity, UserDetailDto.class);
  152. Integer time = 0;
  153. time += courseExtendService.studyTime(id, null, null);
  154. time += sentenceService.studyTime(id, null, null);
  155. time += questionFlowService.studyTime(id, null, null);
  156. dto.setTotalTime(time);
  157. return ResponseHelp.success(dto);
  158. }
  159. @RequestMapping(value = "/real", method = RequestMethod.POST)
  160. @ApiOperation(value = "实名认证", httpMethod = "POST")
  161. public Response<Boolean> real(@RequestBody @Validated UserRealDto dto, HttpSession session) {
  162. User in = usersService.get(dto.getId());
  163. if (in == null){
  164. throw new ParameterException("用户不存在");
  165. }
  166. if (in.getRealTime() != null){
  167. throw new ParameterException("实名认证已通过");
  168. }
  169. User entity = Transform.dtoToEntity(dto);
  170. entity.setRealStatus(1);
  171. entity.setRealTime(new Date());
  172. // 实名认证,半价机经券
  173. entity.setTextbookHalf(1);
  174. usersService.edit(entity);
  175. orderFlowService.giveReal(in);
  176. return ResponseHelp.success(true);
  177. }
  178. @RequestMapping(value = "/money/add", method = RequestMethod.POST)
  179. @ApiOperation(value = "增加用户累计金额", httpMethod = "POST")
  180. public Response<Boolean> addMoney(@RequestBody @Validated UserMoneyDto dto, HttpSession session) {
  181. User in = usersService.get(dto.getId());
  182. if (in == null){
  183. throw new ParameterException("用户不存在");
  184. }
  185. usersService.accumulation(dto.getId(), BigDecimal.valueOf(dto.getMoney()));
  186. return ResponseHelp.success(true);
  187. }
  188. @RequestMapping(value = "/frozen", method = RequestMethod.POST)
  189. @ApiOperation(value = "冻结用户", httpMethod = "POST")
  190. public Response<Boolean> frozen(@RequestBody @Validated UserFrozenDto dto, HttpSession session) {
  191. User entity = usersService.get(dto.getId());
  192. if (entity.getIsFrozen() > 0){
  193. throw new ParameterException("用户已冻结");
  194. }
  195. usersService.edit(User.builder()
  196. .id(dto.getId())
  197. .isFrozen(1)
  198. .build());
  199. return ResponseHelp.success(true);
  200. }
  201. @RequestMapping(value = "/nofrozen", method = RequestMethod.POST)
  202. @ApiOperation(value = "取消冻结用户", httpMethod = "POST")
  203. public Response<Boolean> noFrozen(@RequestBody @Validated UserFrozenDto dto, HttpSession session) {
  204. User entity = usersService.get(dto.getId());
  205. if (entity.getIsFrozen() == 0){
  206. throw new ParameterException("用户未冻结");
  207. }
  208. usersService.edit(User.builder()
  209. .id(dto.getId())
  210. .isFrozen(0)
  211. .build());
  212. return ResponseHelp.success(true);
  213. }
  214. @RequestMapping(value = "/list", method = RequestMethod.GET)
  215. @ApiOperation(value = "用户列表", httpMethod = "GET")
  216. public Response<PageMessage<UserListDto>> list(
  217. @RequestParam(required = false, defaultValue = "1") int page,
  218. @RequestParam(required = false, defaultValue = "100") int size,
  219. @RequestParam(required = false, defaultValue = "") String keyword,
  220. @RequestParam(required = false) Integer[] ids,
  221. @RequestParam(required = false) Boolean real,
  222. @RequestParam(required = false) Boolean wechat,
  223. @RequestParam(required = false) Boolean prepare,
  224. @RequestParam(required = false) String startTime,
  225. @RequestParam(required = false) String endTime,
  226. @RequestParam(required = false, defaultValue = "id") String order,
  227. @RequestParam(required = false, defaultValue = "desc") String direction,
  228. HttpSession session) {
  229. Page<User> p;
  230. if (ids != null && ids.length > 0){
  231. p = usersService.select(ids);
  232. }else{
  233. p = usersService.listAdmin(page, size, keyword, real, wechat, prepare, startTime, endTime, order, DirectionStatus.ValueOf(direction));
  234. }
  235. List<UserListDto> pr = Transform.convert(p, UserListDto.class);
  236. Collection userIds = Transform.getIds(p, User.class, "id");
  237. // 绑定用户服务
  238. Map<Object, Collection<UserService>> serviceByUser = userServiceService.mapByUser(userIds);
  239. Transform.combine(pr, serviceByUser, UserListDto.class, "id", "services", UserServiceExtendDto.class);
  240. return ResponseHelp.success(pr, page, size, p.getTotal());
  241. }
  242. @RequestMapping(value = "/student/list", method = RequestMethod.GET)
  243. @ApiOperation(value = "会员列表", httpMethod = "GET")
  244. public Response<PageMessage<UserListDto>> members(
  245. @RequestParam(required = false, defaultValue = "1") int page,
  246. @RequestParam(required = false, defaultValue = "100") int size,
  247. @RequestParam(required = false, defaultValue = "") String keyword,
  248. @RequestParam(required = false) Integer courseId,
  249. @RequestParam(required = false, defaultValue = "id") String order,
  250. @RequestParam(required = false, defaultValue = "desc") String direction,
  251. HttpSession session) {
  252. // 已经购买过课程的用户
  253. Page<User> p = usersService.listAdminByCourse(page, size, keyword, courseId, order, DirectionStatus.ValueOf(direction));
  254. List<UserListDto> pr = Transform.convert(p, UserListDto.class);
  255. Collection userIds = Transform.getIds(p, User.class, "id");
  256. // 绑定用户课程
  257. Map<Object, Collection<UserCourse>> courseByUser = userCourseService.mapByUser(userIds, false);
  258. Transform.combine(pr, courseByUser, UserListDto.class, "id", "classes", UserCourseExtendDto.class);
  259. return ResponseHelp.success(pr, page, size, p.getTotal());
  260. }
  261. @RequestMapping(value = "/order/detail", method = RequestMethod.GET)
  262. @ApiOperation(value = "用户订单列表", httpMethod = "GET")
  263. public Response<UserOrderDetailDto> getOrder(@RequestParam int id,
  264. HttpSession session) {
  265. UserOrder entity = userOrderService.get(id);
  266. UserOrderDetailDto dto = Transform.convert(entity, UserOrderDetailDto.class);
  267. List<UserOrderRecordExtendDto> list;
  268. if(entity.getPayStatus() == 0){
  269. List<UserOrderCheckout> checkoutList = userOrderCheckoutService.allByUser(entity.getUserId(), entity.getId());
  270. list = Transform.convert(checkoutList, UserOrderRecordExtendDto.class);
  271. }else{
  272. List<UserOrderRecord> recordList = userOrderRecordService.allByUser(entity.getUserId(), entity.getId());
  273. list = Transform.convert(recordList, UserOrderRecordExtendDto.class);
  274. }
  275. dto.setCheckouts(list);
  276. List<UserOrderRecordExtendDto> courseCheckout = list.stream().filter((row)->row.getProductType().equals(ProductType.COURSE.key)).collect(Collectors.toList());
  277. Collection courseIds = Transform.getIds(courseCheckout, UserOrderRecordExtendDto.class, "productId");
  278. List<Course> courseList = courseService.select(courseIds);
  279. dto.setCourses(Transform.convert(courseList, CourseExtendDto.class));
  280. List<UserOrderRecordExtendDto> dataCheckout = list.stream().filter((row)->row.getProductType().equals(ProductType.DATA.key)).collect(Collectors.toList());
  281. Collection dataIds = Transform.getIds(dataCheckout, UserOrderRecordExtendDto.class, "productId");
  282. List<CourseData> dataList = courseDataService.select(dataIds);
  283. dto.setDatas(Transform.convert(dataList, CourseDataExtendDto.class));
  284. List<UserOrderRecordExtendDto> packageCheckout = list.stream().filter((row)->row.getProductType().equals(ProductType.COURSE_PACKAGE.key)).collect(Collectors.toList());
  285. Collection packageIds = Transform.getIds(packageCheckout, UserOrderRecordExtendDto.class, "productId");
  286. List<CoursePackage> packageList = coursePackageService.select(packageIds);
  287. dto.setPackages(Transform.convert(packageList, CoursePackageExtendDto.class));
  288. return ResponseHelp.success(dto);
  289. }
  290. @RequestMapping(value = "/order/finish", method = RequestMethod.PUT)
  291. @ApiOperation(value = "完成支付", httpMethod = "PUT")
  292. private Response<Boolean> finishOrder(@RequestBody @Validated UserOrderFinishDto dto){
  293. UserOrder order = userOrderService.get(dto.getId());
  294. orderFlowService.payed(order.getId(), order.getUserId(), 0L, new Date(), PayMethod.BANK, dto.getTransactionNo());
  295. return ResponseHelp.success(true);
  296. }
  297. @RequestMapping(value = "/order/list", method = RequestMethod.GET)
  298. @ApiOperation(value = "用户订单列表", httpMethod = "GET")
  299. public Response<PageMessage<UserOrderListDto>> listOrder(
  300. @RequestParam(required = false, defaultValue = "1") int page,
  301. @RequestParam(required = false, defaultValue = "100") int size,
  302. @RequestParam(required = false) Integer userId,
  303. @RequestParam(required = false) String productType,
  304. @RequestParam(required = false) String payMethod,
  305. @RequestParam(required = false) Integer orderId,
  306. @RequestParam(required = false, defaultValue = "id") String order,
  307. @RequestParam(required = false, defaultValue = "desc") String direction,
  308. HttpSession session) {
  309. Page<UserOrder> p = userOrderService.listAdmin(page, size, userId, productType, payMethod, orderId, order, DirectionStatus.ValueOf(direction));
  310. List<UserOrderListDto> pr = Transform.convert(p, UserOrderListDto.class);
  311. // 绑定用户
  312. Collection userIds = Transform.getIds(p, UserOrder.class, "userId");
  313. List<User> userList = usersService.select(userIds);
  314. Transform.combine(pr, userList, UserOrderListDto.class, "userId", "user", User.class, "id", UserExtendDto.class);
  315. return ResponseHelp.success(pr, page, size, p.getTotal());
  316. }
  317. @RequestMapping(value = "/record/stop", method = RequestMethod.PUT)
  318. @ApiOperation(value = "停止记录", httpMethod = "PUT")
  319. private Response<Boolean> editService(@RequestBody @Validated UserRecordStopDto dto){
  320. orderFlowService.stopRecord(dto.getId());
  321. return ResponseHelp.success(true);
  322. }
  323. @RequestMapping(value = "/record/list", method = RequestMethod.GET)
  324. @ApiOperation(value = "用户购买列表", httpMethod = "GET")
  325. public Response<PageMessage<UserOrderRecordListDto>> listRecord(
  326. @RequestParam(required = false, defaultValue = "1") int page,
  327. @RequestParam(required = false, defaultValue = "100") int size,
  328. @RequestParam(required = false) Integer orderId,
  329. @RequestParam(required = false) Integer userId,
  330. @RequestParam(required = false) String productType,
  331. @RequestParam(required = false) Integer productId,
  332. @RequestParam(required = false) String service,
  333. @RequestParam(required = false) Boolean needMoney,
  334. @RequestParam(required = false) Boolean needPackage,
  335. @RequestParam(required = false) String order,
  336. @RequestParam(required = false, defaultValue = "desc") String direction,
  337. HttpSession session) {
  338. Page<UserOrderRecord> p = userOrderRecordService.listAdmin(page, size, orderId, userId, ProductType.ValueOf(productType), productId, ServiceKey.ValueOf(service), needMoney,needPackage, order, DirectionStatus.ValueOf(direction));
  339. List<UserOrderRecordListDto> pr = Transform.convert(p, UserOrderRecordListDto.class);
  340. // 绑定用户
  341. Collection userIds = Transform.getIds(p, UserOrderRecord.class, "userId");
  342. List<User> userList = usersService.select(userIds);
  343. Transform.combine(pr, userList, UserOrderRecordListDto.class, "userId", "user", User.class, "id", UserExtendDto.class);
  344. // 绑定课程
  345. List<UserOrderRecordListDto> prCourse = pr.stream().filter((row)-> row.getProductType().equals(ProductType.COURSE.key)).collect(Collectors.toList());
  346. Collection courseIds = Transform.getIds(prCourse, UserOrderRecordListDto.class, "productId");
  347. List<Course> courseList = courseService.select(courseIds);
  348. Transform.combine(prCourse, courseList, UserOrderRecordListDto.class, "productId", "course", Course.class, "id", CourseExtendDto.class);
  349. // 绑定资料
  350. List<UserOrderRecordListDto> prData = pr.stream().filter((row)-> row.getProductType().equals(ProductType.DATA.key)).collect(Collectors.toList());
  351. Collection dataIds = Transform.getIds(prData, UserOrderRecordListDto.class, "productId");
  352. List<CourseData> dataList = courseDataService.select(dataIds);
  353. Transform.combine(prData, dataList, UserOrderRecordListDto.class, "productId", "data", CourseData.class, "id", CourseDataExtendDto.class);
  354. return ResponseHelp.success(pr, page, size, p.getTotal());
  355. }
  356. @RequestMapping(value = "/data/add", method = RequestMethod.POST)
  357. @ApiOperation(value = "添加资料记录", httpMethod = "POST")
  358. private Response<Boolean> addData(@RequestBody @Validated UserDataRecordDto dto){
  359. UserOrderRecord entity = Transform.dtoToEntity(dto);
  360. entity.setProductType(ProductType.DATA.key);
  361. entity.setOrderId(0);
  362. entity.setProductId(dto.getDataId());
  363. if (dto.getMobile() != null && !dto.getMobile().isEmpty()){
  364. // 判断mobile
  365. User user = usersService.getByMobile(dto.getArea(), dto.getMobile());
  366. if (user == null){
  367. // 创建user
  368. user = usersService.register(dto.getArea(), dto.getMobile(), null,null, null,"", null);
  369. }
  370. entity.setUserId(user.getId());
  371. }
  372. // 后台服务创建,都默认你为后台创建
  373. entity.setSource(RecordSource.BACKEND.key);
  374. orderFlowService.addRecord(entity);
  375. return ResponseHelp.success(true);
  376. }
  377. @RequestMapping(value = "/service/add", method = RequestMethod.POST)
  378. @ApiOperation(value = "添加服务记录", httpMethod = "POST")
  379. private Response<Boolean> addService(@RequestBody @Validated UserServiceRecordDto dto){
  380. UserOrderRecord entity = Transform.dtoToEntity(dto);
  381. entity.setProductType(ProductType.SERVICE.key);
  382. entity.setOrderId(0);
  383. entity.setProductId(0);
  384. if (dto.getMobile() != null && !dto.getMobile().isEmpty()){
  385. // 判断mobile
  386. User user = usersService.getByMobile(dto.getArea(), dto.getMobile());
  387. if (user == null){
  388. // 创建user
  389. user = usersService.register(dto.getArea(), dto.getMobile(), null,null, null,"", null);
  390. }
  391. entity.setUserId(user.getId());
  392. }
  393. // 后台服务创建,都默认你为后台创建
  394. entity.setSource(RecordSource.BACKEND.key);
  395. orderFlowService.addRecord(entity);
  396. return ResponseHelp.success(true);
  397. }
  398. @RequestMapping(value = "/service/list", method = RequestMethod.GET)
  399. @ApiOperation(value = "获取服务列表", httpMethod = "GET")
  400. private Response<PageMessage<UserServiceRecordInfoDto>> listService(
  401. @RequestParam(required = false, defaultValue = "1") int page,
  402. @RequestParam(required = false, defaultValue = "100") int size,
  403. @RequestParam(required = false) String service,
  404. @RequestParam(required = false) String param,
  405. @RequestParam(required = false) Integer userId,
  406. @RequestParam(required = false, defaultValue = "id") String order,
  407. @RequestParam(required = false, defaultValue = "desc") String direction
  408. ){
  409. Page<UserOrderRecord> p = userOrderRecordService.listWithServiceAdmin(page, size, ServiceKey.ValueOf(service), param, userId);
  410. List<UserServiceRecordInfoDto> pr = Transform.convert(p, UserServiceRecordInfoDto.class);
  411. // 绑定用户
  412. Collection userIds = Transform.getIds(p, UserOrderRecord.class, "userId");
  413. List<User> userList = usersService.select(userIds);
  414. Transform.combine(pr, userList, UserServiceRecordInfoDto.class, "userId", "user", User.class, "id", UserExtendDto.class);
  415. return ResponseHelp.success(pr, page, size, p.getTotal());
  416. }
  417. @RequestMapping(value = "/feedback_error/edit", method = RequestMethod.PUT)
  418. @ApiOperation(value = "修改勘误信息", httpMethod = "PUT")
  419. public Response<Boolean> editFeedbackError(@RequestBody @Validated UserFeedbackErrorDto dto, HttpServletRequest request) {
  420. UserFeedbackError entity = Transform.dtoToEntity(dto);
  421. UserFeedbackError in = userFeedbackErrorService.get(entity.getId());
  422. // 处理设定
  423. if(in.getHandleTime() == null){
  424. entity.setHandleTime(new Date());
  425. Manager manager = shiroHelp.getLoginManager();
  426. entity.setManagerId(manager.getId());
  427. in.setStatus(dto.getStatus());
  428. User user = usersService.get(in.getUserId());
  429. UserOrderRecord record = null;
  430. if (dto.getStatus() == AnswerStatus.ANSWER.index){
  431. record = orderFlowService.giveAction(user.getId());
  432. }
  433. messageExtendService.sendFeedbackError(user, in, record);
  434. }
  435. entity = userFeedbackErrorService.edit(entity);
  436. managerLogService.log(request);
  437. return ResponseHelp.success(true);
  438. }
  439. @RequestMapping(value = "/feedback_error/detail", method = RequestMethod.GET)
  440. @ApiOperation(value = "勘误详情", httpMethod = "GET")
  441. public Response<UserFeedbackErrorInfoDto> detailFeedbackError(@RequestParam int id, HttpServletRequest request) {
  442. UserFeedbackError entity = userFeedbackErrorService.get(id);
  443. UserFeedbackErrorInfoDto dto = Transform.convert(entity, UserFeedbackErrorInfoDto.class);
  444. User user = usersService.get(entity.getUserId());
  445. UserExtendDto userDto = Transform.convert(user, UserExtendDto.class);
  446. dto.setUser(userDto);
  447. return ResponseHelp.success(dto);
  448. }
  449. @RequestMapping(value = "/feedback_error/list", method = RequestMethod.GET)
  450. @ApiOperation(value = "勘误列表", httpMethod = "GET")
  451. public Response<PageMessage<UserFeedbackErrorInfoDto>> listFeedbackError(
  452. @RequestParam(required = false, defaultValue = "1") int page,
  453. @RequestParam(required = false, defaultValue = "100") int size,
  454. @RequestParam(required = false) String module,
  455. @RequestParam(required = false) String questionType,
  456. @RequestParam(required = false) String target,
  457. @RequestParam(required = false) Integer moduleId,
  458. @RequestParam(required = false) Integer userId,
  459. @RequestParam(required = false) Integer status,
  460. @RequestParam(required = false) String keyword,
  461. @RequestParam(required = false) Integer moneyRang,
  462. @RequestParam(required = false, defaultValue = "id") String order,
  463. @RequestParam(required = false, defaultValue = "desc") String direction,
  464. HttpSession session) {
  465. Page<UserFeedbackError> p = userFeedbackErrorService.listAdmin(page, size, FeedbackModule.ValueOf(module), FeedbackStatus.ValueOf(status), questionType, target, moduleId, keyword, userId, MoneyRange.ValueOf(moneyRang), order, DirectionStatus.ValueOf(direction));
  466. List<UserFeedbackErrorInfoDto> pr = Transform.convert(p, UserFeedbackErrorInfoDto.class);
  467. // 绑定用户
  468. Collection userIds = Transform.getIds(p, UserFeedbackError.class, "userId");
  469. List<User> userList = usersService.select(userIds);
  470. Transform.combine(pr, userList, UserFeedbackErrorInfoDto.class, "userId", "user", User.class, "id", UserExtendDto.class);
  471. return ResponseHelp.success(pr, page, size, p.getTotal());
  472. }
  473. @RequestMapping(value = "/textbook_feedback/edit", method = RequestMethod.PUT)
  474. @ApiOperation(value = "修改机经勘误信息", httpMethod = "PUT")
  475. public Response<Boolean> editTextbookFeedback(@RequestBody @Validated UserTextbookFeedbackDto dto, HttpServletRequest request) {
  476. UserTextbookFeedback entity = Transform.dtoToEntity(dto);
  477. UserTextbookFeedback in = userTextbookFeedbackService.get(entity.getId());
  478. // 处理设定
  479. if(in.getHandleTime() == null){
  480. entity.setHandleTime(new Date());
  481. Manager manager = shiroHelp.getLoginManager();
  482. entity.setManagerId(manager.getId());
  483. in.setStatus(dto.getStatus());
  484. User user = usersService.get(in.getUserId());
  485. UserOrderRecord record = null;
  486. if (dto.getStatus() == AnswerStatus.ANSWER.index){
  487. record = orderFlowService.giveAction(user.getId());
  488. }
  489. messageExtendService.sendTextbookFeedback(user, in, record);
  490. }
  491. entity = userTextbookFeedbackService.edit(entity);
  492. managerLogService.log(request);
  493. return ResponseHelp.success(true);
  494. }
  495. @RequestMapping(value = "/textbook_feedback/detail", method = RequestMethod.GET)
  496. @ApiOperation(value = "机经勘误详情", httpMethod = "GET")
  497. public Response<UserTextbookFeedbackInfoDto> detailTextbookFeedback(@RequestParam int id, HttpServletRequest request) {
  498. UserTextbookFeedback entity = userTextbookFeedbackService.get(id);
  499. UserTextbookFeedbackInfoDto dto = Transform.convert(entity, UserTextbookFeedbackInfoDto.class);
  500. User user = usersService.get(entity.getUserId());
  501. UserExtendDto userDto = Transform.convert(user, UserExtendDto.class);
  502. dto.setUser(userDto);
  503. TextbookLibrary library = textbookLibraryService.get(entity.getLibraryId());
  504. TextbookLibraryExtendDto libraryDto = Transform.convert(library, TextbookLibraryExtendDto.class);
  505. dto.setLibrary(libraryDto);
  506. TextbookTopic topic = textbookTopicService.get(entity.getTopicId());
  507. TextbookTopicExtendDto topicDto = Transform.convert(library, TextbookTopicExtendDto.class);
  508. dto.setTopic(topicDto);
  509. return ResponseHelp.success(dto);
  510. }
  511. @RequestMapping(value = "/textbook_feedback/list", method = RequestMethod.GET)
  512. @ApiOperation(value = "机经勘误列表", httpMethod = "GET")
  513. public Response<PageMessage<UserTextbookFeedbackInfoDto>> listTextbookFeedback(
  514. @RequestParam(required = false, defaultValue = "1") int page,
  515. @RequestParam(required = false, defaultValue = "100") int size,
  516. @RequestParam(required = false) String target,
  517. @RequestParam(required = false) String questionSubject,
  518. @RequestParam(required = false) Integer status,
  519. @RequestParam(required = false) Integer no,
  520. @RequestParam(required = false, defaultValue = "id") String order,
  521. @RequestParam(required = false, defaultValue = "desc") String direction,
  522. HttpSession session) {
  523. Page<UserTextbookFeedback> p = userTextbookFeedbackService.listAdmin(page, size, target, questionSubject, FeedbackStatus.ValueOf(status), no, order, DirectionStatus.ValueOf(direction));
  524. List<UserTextbookFeedbackInfoDto> pr = Transform.convert(p, UserTextbookFeedbackInfoDto.class);
  525. // 绑定用户
  526. Collection userIds = Transform.getIds(p, UserTextbookFeedback.class, "userId");
  527. List<User> userList = usersService.select(userIds);
  528. Transform.combine(pr, userList, UserTextbookFeedbackInfoDto.class, "userId", "user", User.class, "id", UserExtendDto.class);
  529. // 绑定换库
  530. Collection libraryIds = Transform.getIds(p, UserTextbookFeedback.class, "libraryId");
  531. List<TextbookLibrary> libraryList = textbookLibraryService.select(libraryIds);
  532. Transform.combine(pr, libraryList, UserTextbookFeedbackInfoDto.class, "libraryId", "library", TextbookLibrary.class, "id", TextbookLibraryExtendDto.class);
  533. // 绑定题目
  534. Collection topicIds = Transform.getIds(p, UserTextbookFeedback.class, "topicId");
  535. List<TextbookTopic> topicList = textbookTopicService.select(topicIds);
  536. Transform.combine(pr, topicList, UserTextbookFeedbackInfoDto.class, "topicId", "topic", TextbookTopic.class, "id", TextbookTopicExtendDto.class);
  537. return ResponseHelp.success(pr, page, size, p.getTotal());
  538. }
  539. @RequestMapping(value = "/ready_room_feedback/edit", method = RequestMethod.PUT)
  540. @ApiOperation(value = "修改考场补充信息", httpMethod = "PUT")
  541. public Response<Boolean> editReadyRoomFeedback(@RequestBody @Validated UserReadyRoomFeedbackDto dto, HttpServletRequest request) {
  542. UserReadyRoomFeedback entity = Transform.dtoToEntity(dto);
  543. UserReadyRoomFeedback in = userReadyRoomFeedbackService.get(entity.getId());
  544. // 处理设定
  545. if(in.getHandleTime() == null){
  546. entity.setHandleTime(new Date());
  547. Manager manager = shiroHelp.getLoginManager();
  548. entity.setManagerId(manager.getId());
  549. }
  550. entity = userReadyRoomFeedbackService.edit(entity);
  551. managerLogService.log(request);
  552. return ResponseHelp.success(true);
  553. }
  554. @RequestMapping(value = "/ready_room_feedback/detail", method = RequestMethod.GET)
  555. @ApiOperation(value = "考场补充详情", httpMethod = "GET")
  556. public Response<UserReadyRoomFeedbackInfoDto> detailReadyRoomFeedback(@RequestParam int id, HttpServletRequest request) {
  557. UserReadyRoomFeedback entity = userReadyRoomFeedbackService.get(id);
  558. UserReadyRoomFeedbackInfoDto dto = Transform.convert(entity, UserReadyRoomFeedbackInfoDto.class);
  559. User user = usersService.get(entity.getUserId());
  560. UserExtendDto userDto = Transform.convert(user, UserExtendDto.class);
  561. dto.setUser(userDto);
  562. ReadyRoom room = readyRoomService.get(entity.getRoomId());
  563. ReadyRoomExtendDto roomDto = Transform.convert(room, ReadyRoomExtendDto.class);
  564. dto.setRoom(roomDto);
  565. return ResponseHelp.success(dto);
  566. }
  567. @RequestMapping(value = "/ready_room_feedback/list", method = RequestMethod.GET)
  568. @ApiOperation(value = "考场补充列表", httpMethod = "GET")
  569. public Response<PageMessage<UserReadyRoomFeedbackInfoDto>> listReadyRoomFeedback(
  570. @RequestParam(required = false, defaultValue = "1") int page,
  571. @RequestParam(required = false, defaultValue = "100") int size,
  572. @RequestParam(required = false) Integer status,
  573. @RequestParam(required = false, defaultValue = "id") String order,
  574. @RequestParam(required = false, defaultValue = "desc") String direction,
  575. HttpSession session) {
  576. Page<UserReadyRoomFeedback> p = userReadyRoomFeedbackService.listAdmin(page, size, FeedbackStatus.ValueOf(status), order, DirectionStatus.ValueOf(direction));
  577. List<UserReadyRoomFeedbackInfoDto> pr = Transform.convert(p, UserReadyRoomFeedbackInfoDto.class);
  578. // 绑定用户
  579. Collection userIds = Transform.getIds(p, UserReadyRoomFeedback.class, "userId");
  580. List<User> userList = usersService.select(userIds);
  581. Transform.combine(pr, userList, UserReadyRoomFeedbackInfoDto.class, "userId", "user", User.class, "id", UserExtendDto.class);
  582. // 绑定考场
  583. Collection roomIds = Transform.getIds(p, UserReadyRoomFeedback.class, "roomId");
  584. List<ReadyRoom> roomList = readyRoomService.select(roomIds);
  585. Transform.combine(pr, roomList, UserReadyRoomFeedbackInfoDto.class, "roomId", "room", ReadyRoom.class, "id", ReadyRoomExtendDto.class);
  586. return ResponseHelp.success(pr, page, size, p.getTotal());
  587. }
  588. @RequestMapping(value = "/course/appointment/add", method = RequestMethod.POST)
  589. @ApiOperation(value = "添加课程预约", httpMethod = "POST")
  590. public Response<UserCourseAppointment> addCourseAppointment(@RequestBody @Validated UserCourseAppointmentDto dto, HttpServletRequest request) {
  591. // 判断课程是否已开通,否则先开通课程
  592. UserOrderRecord record = userOrderRecordService.get(dto.getRecordId());
  593. if (record==null){
  594. throw new ParameterException("记录不存在");
  595. }
  596. if (record.getIsUsed()==0){
  597. orderFlowService.useRecord(dto.getUserId(), dto.getRecordId());
  598. }else if(record.getIsStop() > 0){
  599. throw new ParameterException("已停用");
  600. }
  601. UserCourseAppointment entity = Transform.dtoToEntity(dto);
  602. entity = userCourseAppointmentService.addAppointment(entity);
  603. // 第一次预约,开通
  604. if (entity.getNo() == 1){
  605. orderFlowService.useRecord(record.getUserId(), record.getId());
  606. }
  607. managerLogService.log(request);
  608. return ResponseHelp.success(Transform.convert(entity, CourseTime.class));
  609. }
  610. @RequestMapping(value = "/course/appointment/edit", method = RequestMethod.PUT)
  611. @ApiOperation(value = "编辑课程预约", httpMethod = "PUT")
  612. public Response<Boolean> editCourseAppointment(@RequestBody @Validated UserCourseAppointmentDto dto, HttpServletRequest request) {
  613. UserCourseAppointment entity = Transform.dtoToEntity(dto);
  614. entity = userCourseAppointmentService.edit(entity);
  615. managerLogService.log(request);
  616. return ResponseHelp.success(true);
  617. }
  618. @RequestMapping(value = "/course/appointment/delete", method = RequestMethod.DELETE)
  619. @ApiOperation(value = "删除课程预约", httpMethod = "DELETE")
  620. public Response<Boolean> deleteCourseAppointment(@RequestParam int id, HttpServletRequest request) {
  621. UserCourseAppointment in = userCourseAppointmentService.get(id);
  622. // 调整课时序号
  623. userCourseAppointmentService.deleteAppointment(id);
  624. // 删除对应预习作业关系
  625. previewAssignService.removeCourseAppointment(in.getCourseId(), in.getId());
  626. managerLogService.log(request);
  627. return ResponseHelp.success(true);
  628. }
  629. @RequestMapping(value = "/course/appointment/detail", method = RequestMethod.GET)
  630. @ApiOperation(value = "获取课程预约", httpMethod = "GET")
  631. public Response<CourseTime> detailCourseAppointment(@RequestParam int id,HttpSession session) {
  632. UserCourseAppointment entity = userCourseAppointmentService.get(id);
  633. return ResponseHelp.success(Transform.convert(entity, UserCourseAppointment.class));
  634. }
  635. @RequestMapping(value = "/course/appointment/list", method = RequestMethod.GET)
  636. @ApiOperation(value = "课程预约列表", httpMethod = "GET")
  637. public Response<PageMessage<UserCourseAppointmentInfoDto>> listCourseAppointment(
  638. @RequestParam(required = false, defaultValue = "1") int page,
  639. @RequestParam(required = false, defaultValue = "100") int size,
  640. @RequestParam(required = false) Integer[] ids,
  641. @RequestParam(required = false) Integer recordId,
  642. @RequestParam(required = false) Integer userId,
  643. @RequestParam(required = false) Integer courseId,
  644. @RequestParam(required = false) String startTime,
  645. @RequestParam(required = false) String endTime,
  646. @RequestParam(required = false, defaultValue = "id") String order,
  647. @RequestParam(required = false, defaultValue = "desc") String direction,
  648. HttpSession session) {
  649. Page<UserCourseAppointment> p;
  650. if (ids != null && ids.length > 0){
  651. p = userCourseAppointmentService.select(ids);
  652. }else{
  653. p = userCourseAppointmentService.listAdmin(page, size, recordId, userId, courseId, startTime, endTime, order, DirectionStatus.ValueOf(direction));
  654. }
  655. List<UserCourseAppointmentInfoDto> pr = Transform.convert(p, UserCourseAppointmentInfoDto.class);
  656. // 绑定作业记录
  657. Collection appointmentIds = Transform.getIds(p, UserCourseAppointment.class, "id");
  658. List<PreviewAssign> previewAssignList = previewAssignService.listWithAppointment(appointmentIds);
  659. Map previewAssignMap = Transform.getMap(previewAssignList, PreviewAssign.class, "courseAppointment", "id");
  660. Collection assignIds = Transform.getIds(previewAssignList, PreviewAssign.class, "id");
  661. List<UserPaper> userPaperList=userPaperService.listWithAppointment(assignIds);
  662. Map userPaperMap = Transform.getMap(userPaperList, UserPaper.class, "originId", "id");
  663. for(UserCourseAppointmentInfoDto dto : pr){
  664. dto.setPaperId((Integer)userPaperMap.get(previewAssignMap.get(dto.getId())));
  665. }
  666. Transform.combine(pr, userPaperList, UserCourseAppointmentInfoDto.class, "paperId", "userPaper", UserPaper.class, "id", UserPaperExtendDto.class);
  667. // 获取最后一次作业结果
  668. Collection paperIds = Transform.getIds(userPaperList, UserPaper.class, "id");
  669. List<UserReport> reportList = userReportService.listWithLast(paperIds);
  670. Transform.combine(pr, reportList, UserCourseAppointmentInfoDto.class, "paperId", "userReport", UserReport.class, "paperId", UserReportExtendDto.class);
  671. return ResponseHelp.success(pr, page, size, p.getTotal());
  672. }
  673. @RequestMapping(value = "/course/appointment/comment/add", method = RequestMethod.POST)
  674. @ApiOperation(value = "添加课程预约评论", httpMethod = "POST")
  675. public Response<UserCourseAppointment> addCourseAppointmentComment(@RequestBody @Validated UserCourseAppointmentCommentDto dto, HttpServletRequest request) {
  676. UserCourseAppointmentComment entity = Transform.dtoToEntity(dto);
  677. if (entity.getParentId() > 0){
  678. UserCourseAppointmentComment comment = userCourseAppointmentCommentService.get(entity.getParentId());
  679. if (comment != null){
  680. entity.setReply(comment.getContent());
  681. }
  682. }
  683. entity = userCourseAppointmentCommentService.add(entity);
  684. managerLogService.log(request);
  685. return ResponseHelp.success(Transform.convert(entity, CourseTime.class));
  686. }
  687. @RequestMapping(value = "/course/appointment/comment/edit", method = RequestMethod.PUT)
  688. @ApiOperation(value = "编辑课程预约聊天", httpMethod = "PUT")
  689. public Response<Boolean> editCourseAppointmentComment(@RequestBody @Validated UserCourseAppointmentCommentDto dto, HttpServletRequest request) {
  690. UserCourseAppointmentComment entity = Transform.dtoToEntity(dto);
  691. if (entity.getParentId() > 0){
  692. UserCourseAppointmentComment comment = userCourseAppointmentCommentService.get(entity.getParentId());
  693. if (comment != null){
  694. entity.setReply(comment.getContent());
  695. }
  696. }
  697. entity = userCourseAppointmentCommentService.edit(entity);
  698. managerLogService.log(request);
  699. return ResponseHelp.success(true);
  700. }
  701. @RequestMapping(value = "/course/appointment/comment/delete", method = RequestMethod.DELETE)
  702. @ApiOperation(value = "删除课程预约聊天", httpMethod = "DELETE")
  703. public Response<Boolean> deleteCourseAppointmentComment(@RequestParam int id, HttpServletRequest request) {
  704. UserCourseAppointmentComment in = userCourseAppointmentCommentService.get(id);
  705. userCourseAppointmentCommentService.delete(id);
  706. managerLogService.log(request);
  707. return ResponseHelp.success(true);
  708. }
  709. @RequestMapping(value = "/course/appointment/comment/all", method = RequestMethod.GET)
  710. @ApiOperation(value = "课程预约评论列表", httpMethod = "GET")
  711. public Response<List<UserCourseAppointmentComment>> listCourseAppointment(
  712. @RequestParam(required = false) Integer appointmentId,
  713. @RequestParam(required = false) String type,
  714. HttpSession session) {
  715. List<UserCourseAppointmentComment> p = userCourseAppointmentCommentService.allAdmin(appointmentId, type);
  716. return ResponseHelp.success(p);
  717. }
  718. @RequestMapping(value = "/course/record/all", method = RequestMethod.GET)
  719. @ApiOperation(value = "课程学习列表", httpMethod = "GET")
  720. public Response<List<UserCourseProgressInfoDto>> allCourseRecord(
  721. @RequestParam(required = false) Integer recordId,
  722. HttpSession session) {
  723. UserOrderRecord record = userOrderRecordService.get(recordId);
  724. Integer courseId = record.getProductId();
  725. Integer userId = record.getUserId();
  726. List<UserCourseProgress> p = userCourseProgressService.listCourse(recordId, courseId);
  727. List<UserCourseProgressInfoDto> pr = Transform.convert(p, UserCourseProgressInfoDto.class);
  728. // 绑定课时
  729. Collection courseNoIds = Transform.getIds(p, UserCourseProgress.class, "courseNoId");
  730. List<CourseNo> courseNoList = courseNoService.select(courseNoIds);
  731. Transform.combine(pr, courseNoList, UserCourseProgressInfoDto.class, "courseNoId", "courseNo", CourseNo.class, "id", CourseNoExtendDto.class);
  732. // 绑定所有学习记录
  733. Map<Integer, List<UserCourseRecord>> recordMap = userCourseRecordService.groupByCourse(recordId, courseNoIds);
  734. for(UserCourseProgressInfoDto dto : pr){
  735. dto.setRecords(recordMap.getOrDefault(dto.getCourseNoId(), null));
  736. }
  737. // 绑定预习作业
  738. List<PreviewAssign> previewAssignList = previewAssignService.listByCourseNos(courseId, courseNoIds);
  739. Map previewAssignMap = Transform.getMap(previewAssignList, PreviewAssign.class, "courseNo", "id");
  740. Collection assignIds = Transform.getIds(previewAssignList, PreviewAssign.class, "id");
  741. List<UserPaper> userPaperList = userPaperService.listWithCourse(userId, assignIds, recordId);
  742. Map userPaperMap = Transform.getMap(userPaperList, UserPaper.class, "originId", "id");
  743. for(UserCourseProgressInfoDto dto : pr){
  744. dto.setPaperId((Integer)userPaperMap.get(previewAssignMap.get(dto.getId())));
  745. }
  746. Transform.combine(pr, userPaperList, UserCourseProgressInfoDto.class, "paperId", "userPaper", UserPaper.class, "id", UserPaperExtendDto.class);
  747. // 获取最后一次作业结果
  748. Collection paperIds = Transform.getIds(userPaperList, UserPaper.class, "id");
  749. List<UserReport> reportList = userReportService.listWithLast(paperIds);
  750. Transform.combine(pr, reportList, UserCourseProgressInfoDto.class, "paperId", "userReport", UserReport.class, "paperId", UserReportExtendDto.class);
  751. return ResponseHelp.success(pr);
  752. }
  753. @RequestMapping(value = "/invoice/finish", method = RequestMethod.PUT)
  754. @ApiOperation(value = "开发票", httpMethod = "PUT")
  755. public Response<Boolean> finishInvoice(@RequestBody @Validated InvoiceFinishDto dto,
  756. HttpServletRequest request) {
  757. userInvoiceService.finish(dto.getIds());
  758. managerLogService.log(request);
  759. return ResponseHelp.success(true);
  760. }
  761. @RequestMapping(value = "/invoice/download", method = RequestMethod.GET)
  762. @ApiOperation(value = "下载发票", httpMethod = "GET")
  763. public Response<Boolean> downloadInvoice(
  764. @RequestParam(required = false) Integer[] ids,
  765. HttpServletRequest request, HttpServletResponse response) throws IOException {
  766. managerLogService.log(request);
  767. userInvoiceService.download(ids);
  768. List<UserInvoice> list = userInvoiceService.select(ids);
  769. Collection userIds = Transform.getIds(list, UserInvoice.class, "userId");
  770. List<User> userList = usersService.select(userIds);
  771. Map userMap = Transform.getMap(userList, User.class, "id");
  772. Collection orderIds = Transform.getIds(list, UserInvoice.class, "orderId");
  773. List<UserOrder> orderList = userOrderService.select(orderIds);
  774. Map orderMap = Transform.getMap(orderList, UserOrder.class, "id");
  775. String columnNames[]={"申请时间","用户昵称","用户ID","用户手机号","开票今金额","开票内容", "发票抬头", "纳税人识别号", "收件邮箱"};//列名
  776. String filename = "发票";
  777. //生成一个Excel文件
  778. // 创建excel工作簿
  779. Workbook wb = new HSSFWorkbook();
  780. // 创建第一个sheet(页),并命名
  781. Sheet sheet = wb.createSheet();
  782. // 创建第一行
  783. Row row = sheet.createRow(0);
  784. //设置列名
  785. for(int i=0;i<columnNames.length;i++){
  786. Cell cell = row.createCell(i);
  787. cell.setCellValue(columnNames[i]);
  788. }
  789. int i = 0;
  790. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  791. for(UserInvoice invoice : list){
  792. i+=1;
  793. int j = -1;
  794. Row r = sheet.createRow(i);
  795. User user = (User) userMap.get(invoice.getUserId());
  796. UserOrder userOrder = (UserOrder) orderMap.get(invoice.getOrderId());
  797. Cell time = r.createCell(++j);
  798. time.setCellValue(sdf.format(invoice.getCreateTime()));
  799. Cell nickname = r.createCell(++j);
  800. nickname.setCellValue(user.getNickname());
  801. Cell userId = r.createCell(++j);
  802. userId.setCellValue(user.getId());
  803. Cell mobile = r.createCell(++j);
  804. mobile.setCellValue(user.getMobile());
  805. Cell invoiceMoney = r.createCell(++j);
  806. invoiceMoney.setCellValue(userOrder.getInvoiceMoney().toString());
  807. Cell content = r.createCell(++j);
  808. content.setCellValue("服务费:");
  809. Cell title = r.createCell(++j);
  810. title.setCellValue(invoice.getTitle());
  811. Cell identity = r.createCell(++j);
  812. identity.setCellValue(invoice.getIdentity());
  813. Cell email = r.createCell(++j);
  814. email.setCellValue(user.getEmail());
  815. }
  816. //同理可以设置数据行
  817. ByteArrayOutputStream os = new ByteArrayOutputStream();
  818. try {
  819. wb.write(os);
  820. } catch (IOException e) {
  821. e.printStackTrace();
  822. }
  823. byte[] content = os.toByteArray();
  824. InputStream is = new ByteArrayInputStream(content);
  825. // 设置response参数,可以打开下载页面
  826. response.reset();
  827. response.setContentType("application/vnd.ms-excel;charset=utf-8");
  828. response.setHeader("Content-Disposition", "attachment;filename="+ new String((filename + ".xls").getBytes(), "iso-8859-1"));
  829. ServletOutputStream out = response.getOutputStream();
  830. BufferedInputStream bis = null;
  831. BufferedOutputStream bos = null;
  832. try {
  833. bis = new BufferedInputStream(is);
  834. bos = new BufferedOutputStream(out);
  835. byte[] buff = new byte[2048];
  836. int bytesRead;
  837. // Simple read/write loop.
  838. while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
  839. bos.write(buff, 0, bytesRead);
  840. }
  841. } catch (final IOException e) {
  842. throw e;
  843. } finally {
  844. if (bis != null)
  845. bis.close();
  846. if (bos != null)
  847. bos.close();
  848. }
  849. return null;
  850. }
  851. @RequestMapping(value = "/invoice/list", method = RequestMethod.GET)
  852. @ApiOperation(value = "发票列表", httpMethod = "GET")
  853. public Response<PageMessage<UserInvoiceListDto>> listInvoice(
  854. @RequestParam(required = false, defaultValue = "1") int page,
  855. @RequestParam(required = false, defaultValue = "100") int size,
  856. @RequestParam(required = false) Integer userId,
  857. @RequestParam(required = false) Boolean isFinish,
  858. @RequestParam(required = false) Boolean isDownload,
  859. @RequestParam(required = false, defaultValue = "id") String order,
  860. @RequestParam(required = false, defaultValue = "desc") String direction,
  861. HttpSession session) {
  862. Page<UserInvoice> p = userInvoiceService.listAdmin(page, size, userId, isDownload, isFinish, order, DirectionStatus.ValueOf(direction));
  863. List<UserInvoiceListDto> pr = Transform.convert(p, UserInvoiceListDto.class);
  864. // 绑定用户
  865. Collection userIds = Transform.getIds(p, UserInvoice.class, "userId");
  866. List<User> userList = usersService.select(userIds);
  867. Transform.combine(pr, userList, UserInvoiceListDto.class, "userId", "user", User.class, "id", UserExtendDto.class);
  868. // 绑定订单
  869. Collection orderIds = Transform.getIds(p, UserInvoice.class, "orderId");
  870. List<UserOrder> orderList = userOrderService.select(orderIds);
  871. Transform.combine(pr, orderList, UserInvoiceListDto.class, "orderId", "order", UserOrder.class, "id", UserOrderExtendDto.class);
  872. return ResponseHelp.success(pr, page, size, p.getTotal());
  873. }
  874. @RequestMapping(value = "/valid/mobile", method = RequestMethod.GET)
  875. @ApiOperation(value = "验证手机号", notes="查询手机对应账号", httpMethod = "GET")
  876. public Response<Boolean> validMobile(
  877. @RequestParam(required = true) String area,
  878. @RequestParam(required = true) String mobile
  879. ){
  880. User user = usersService.getByMobile(area, mobile);
  881. if(user != null){
  882. return ResponseHelp.success(false);
  883. }
  884. return ResponseHelp.success(true);
  885. }
  886. @RequestMapping(value = "/abnormal/handler", method = RequestMethod.POST)
  887. @ApiOperation(value = "异常登录处理", httpMethod = "POST")
  888. public Response<Boolean> editAbnormal(@RequestBody @Validated UserAbnormalHandlerDto dto, HttpServletRequest request) {
  889. UserAbnormal entity = Transform.dtoToEntity(dto);
  890. UserAbnormal in = userAbnormalService.get(entity.getId());
  891. if (in.getIsAlert() != null && in.getIsAlert() > 0){
  892. throw new ParameterException("已处理");
  893. }
  894. if (in.getIsIgnore() != null && in.getIsIgnore() > 0){
  895. throw new ParameterException("已处理");
  896. }
  897. if (dto.getIsAlert() != null && dto.getIsAlert() > 1){
  898. User user = usersService.get(in.getUserId());
  899. usersService.edit(User.builder().id(user.getId()).totalAlert(user.getTotalAlert() + 1).build());
  900. messageExtendService.sendLoginAbnormal(user, in);
  901. }
  902. entity = userAbnormalService.edit(entity);
  903. managerLogService.log(request);
  904. return ResponseHelp.success(true);
  905. }
  906. @RequestMapping(value = "/abnormal/detail", method = RequestMethod.GET)
  907. @ApiOperation(value = "异常登录详情", httpMethod = "GET")
  908. public Response<UserAbnormalInfoDto> detailAbnormal(@RequestParam int id, HttpServletRequest request) {
  909. UserAbnormal entity = userAbnormalService.get(id);
  910. UserAbnormalInfoDto dto = Transform.convert(entity, UserAbnormalInfoDto.class);
  911. User user = usersService.get(entity.getUserId());
  912. UserExtendDto userDto = Transform.convert(user, UserExtendDto.class);
  913. dto.setUser(userDto);
  914. return ResponseHelp.success(dto);
  915. }
  916. @RequestMapping(value = "/abnormal/list", method = RequestMethod.GET)
  917. @ApiOperation(value = "异常登录列表", httpMethod = "GET")
  918. public Response<PageMessage<UserAbnormalInfoDto>> listAbnormal(
  919. @RequestParam(required = false, defaultValue = "1") int page,
  920. @RequestParam(required = false, defaultValue = "100") int size,
  921. @RequestParam(required = false) Integer userId,
  922. @RequestParam(required = false) Integer totalAlert,
  923. @RequestParam(required = false) String startTime,
  924. @RequestParam(required = false) String endTime,
  925. @RequestParam(required = false, defaultValue = "id") String order,
  926. @RequestParam(required = false, defaultValue = "desc") String direction,
  927. HttpSession session) {
  928. Page<UserAbnormal> p = userAbnormalService.listAdmin(page, size, userId, totalAlert, startTime, endTime, order, DirectionStatus.ValueOf(direction));
  929. List<UserAbnormalInfoDto> pr = Transform.convert(p, UserAbnormalInfoDto.class);
  930. // 绑定用户
  931. Collection userIds = Transform.getIds(p, UserAbnormal.class, "userId");
  932. List<User> userList = usersService.select(userIds);
  933. Transform.combine(pr, userList, UserAbnormalInfoDto.class, "userId", "user", User.class, "id", UserExtendDto.class);
  934. return ResponseHelp.success(pr, page, size, p.getTotal());
  935. }
  936. }