diff --git a/src/main/java/love/sola/netsupport/api/Authorize.java b/src/main/java/love/sola/netsupport/api/Authorize.java index a7f1f0e..217eb7b 100644 --- a/src/main/java/love/sola/netsupport/api/Authorize.java +++ b/src/main/java/love/sola/netsupport/api/Authorize.java @@ -5,7 +5,7 @@ import love.sola.netsupport.config.Settings; import love.sola.netsupport.pojo.User; import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.sql.TableUser; -import love.sola.netsupport.util.JsonP; +import love.sola.netsupport.util.ParseUtil; import love.sola.netsupport.wechat.Command; import javax.servlet.ServletException; @@ -42,7 +42,7 @@ public class Authorize extends HttpServlet { response.addHeader("Content-type", "text/json;charset=utf-8"); PrintWriter out = response.getWriter(); String json = gson.toJson(authorize(request)); - out.println(JsonP.parse(request, json)); + out.println(ParseUtil.parseJsonP(request, json)); out.close(); } diff --git a/src/main/java/love/sola/netsupport/api/TicketQuery.java b/src/main/java/love/sola/netsupport/api/TicketQuery.java index af584df..9445b80 100644 --- a/src/main/java/love/sola/netsupport/api/TicketQuery.java +++ b/src/main/java/love/sola/netsupport/api/TicketQuery.java @@ -4,7 +4,7 @@ import com.google.gson.Gson; import love.sola.netsupport.pojo.Ticket; import love.sola.netsupport.pojo.User; import love.sola.netsupport.sql.SQLCore; -import love.sola.netsupport.util.JsonP; +import love.sola.netsupport.util.ParseUtil; import love.sola.netsupport.wechat.Command; import org.hibernate.Criteria; import org.hibernate.HibernateException; @@ -42,7 +42,7 @@ public class TicketQuery extends HttpServlet { response.addHeader("Content-type", "text/json;charset=utf-8"); PrintWriter out = response.getWriter(); String json = gson.toJson(query(request)); - out.println(JsonP.parse(request, json)); + out.println(ParseUtil.parseJsonP(request, json)); out.close(); } diff --git a/src/main/java/love/sola/netsupport/api/TicketSubmit.java b/src/main/java/love/sola/netsupport/api/TicketSubmit.java index ba87d26..9a24a49 100644 --- a/src/main/java/love/sola/netsupport/api/TicketSubmit.java +++ b/src/main/java/love/sola/netsupport/api/TicketSubmit.java @@ -4,7 +4,7 @@ import com.google.gson.Gson; import love.sola.netsupport.pojo.Ticket; import love.sola.netsupport.pojo.User; import love.sola.netsupport.sql.SQLCore; -import love.sola.netsupport.util.JsonP; +import love.sola.netsupport.util.ParseUtil; import love.sola.netsupport.wechat.Command; import org.hibernate.HibernateException; import org.hibernate.Session; @@ -40,7 +40,7 @@ public class TicketSubmit extends HttpServlet { response.addHeader("Content-type", "text/json;charset=utf-8"); PrintWriter out = response.getWriter(); String json = gson.toJson(submit(request)); - out.println(JsonP.parse(request, json)); + out.println(ParseUtil.parseJsonP(request, json)); out.close(); } diff --git a/src/main/java/love/sola/netsupport/api/admin/GetUser.java b/src/main/java/love/sola/netsupport/api/admin/GetUser.java index a3e4e30..aff368b 100644 --- a/src/main/java/love/sola/netsupport/api/admin/GetUser.java +++ b/src/main/java/love/sola/netsupport/api/admin/GetUser.java @@ -5,7 +5,7 @@ import love.sola.netsupport.api.Response; import love.sola.netsupport.pojo.User; import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.sql.TableUser; -import love.sola.netsupport.util.JsonP; +import love.sola.netsupport.util.ParseUtil; import javax.servlet.ServletConfig; import javax.servlet.ServletException; @@ -43,7 +43,7 @@ public class GetUser extends HttpServlet { response.addHeader("Content-type", "text/json;charset=utf-8"); PrintWriter out = response.getWriter(); String json = gson.toJson(query(request)); - out.println(JsonP.parse(request, json)); + out.println(ParseUtil.parseJsonP(request, json)); out.close(); } diff --git a/src/main/java/love/sola/netsupport/sql/TableTicket.java b/src/main/java/love/sola/netsupport/sql/TableTicket.java index 382eb05..029c116 100644 --- a/src/main/java/love/sola/netsupport/sql/TableTicket.java +++ b/src/main/java/love/sola/netsupport/sql/TableTicket.java @@ -27,7 +27,7 @@ public class TableTicket extends SQLCore { public static final String COLUMN_STATUS = "status"; - public static Ticket queryLastOpen(User u) { + public static Ticket queryLatestOpen(User u) { try (Session s = SQLCore.sf.openSession()) { return (Ticket) s.createCriteria(Ticket.class) .addOrder(Order.desc(Ticket.PROPERTY_SUBMIT_TIME)) @@ -38,7 +38,7 @@ public class TableTicket extends SQLCore { } } - public static Ticket queryLast(User u) { + public static Ticket queryLatest(User u) { try (Session s = SQLCore.sf.openSession()) { return (Ticket) s.createCriteria(Ticket.class) .addOrder(Order.desc(Ticket.PROPERTY_SUBMIT_TIME)) diff --git a/src/main/java/love/sola/netsupport/util/JsonP.java b/src/main/java/love/sola/netsupport/util/JsonP.java deleted file mode 100644 index a04b802..0000000 --- a/src/main/java/love/sola/netsupport/util/JsonP.java +++ /dev/null @@ -1,21 +0,0 @@ -package love.sola.netsupport.util; - -import javax.servlet.http.HttpServletRequest; - -/** - * *********************************************** - * Created by Sola on 2015/12/3. - * Don't modify this source without my agreement - * *********************************************** - */ -public class JsonP { - - public static String parse(HttpServletRequest request, String json) { - String jsonp = request.getParameter("jsonp"); - if (jsonp == null || jsonp.isEmpty()) - return json; - else - return jsonp.replace("{0}", json); - } - -} diff --git a/src/main/java/love/sola/netsupport/util/ParseUtil.java b/src/main/java/love/sola/netsupport/util/ParseUtil.java new file mode 100644 index 0000000..1508ff7 --- /dev/null +++ b/src/main/java/love/sola/netsupport/util/ParseUtil.java @@ -0,0 +1,42 @@ +package love.sola.netsupport.util; + +import love.sola.netsupport.enums.Status; +import love.sola.netsupport.pojo.Ticket; + +import javax.servlet.http.HttpServletRequest; +import java.text.SimpleDateFormat; + +import static love.sola.netsupport.config.Lang.lang; + +/** + * *********************************************** + * Created by Sola on 2015/12/11. + * Don't modify this source without my agreement + * *********************************************** + */ +public class ParseUtil { + + public static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm EEE"); + + public static String parseTicket(Ticket t) { + StringBuilder sb = new StringBuilder() + .append(lang("Ticket_Info_Id")).append(t.getId()).append("\n") + .append(lang("Ticket_Info_Desc")).append(t.getDescription()).append("\n") + .append(lang("Ticket_Info_Submit_Time")).append(dateFormat.format(t.getSubmitTime())).append("\n"); + if (t.getUpdateTime() != null) { + sb.append(lang("Ticket_Info_Operator")).append(t.getOperator().getId()).append("\n"); + sb.append(lang("Ticket_Info_Remark")).append(t.getRemark()).append("\n"); + sb.append(lang("Ticket_Info_Update_Time")).append(dateFormat.format(t.getUpdateTime())).append("\n"); + } + sb.append(lang("Ticket_Info_Status")).append(Status.getLocalized(t.getStatus())); + return sb.toString(); + } + + public static String parseJsonP(HttpServletRequest request, String json) { + String jsonp = request.getParameter("jsonp"); + if (jsonp == null || jsonp.isEmpty()) + return json; + else + return jsonp.replace("{0}", json); + } +} diff --git a/src/main/java/love/sola/netsupport/wechat/Command.java b/src/main/java/love/sola/netsupport/wechat/Command.java index 57cf2db..c123b17 100644 --- a/src/main/java/love/sola/netsupport/wechat/Command.java +++ b/src/main/java/love/sola/netsupport/wechat/Command.java @@ -1,5 +1,6 @@ package love.sola.netsupport.wechat; +import love.sola.netsupport.wechat.handler.CancelHandler; import love.sola.netsupport.wechat.handler.QueryHandler; import love.sola.netsupport.wechat.handler.RegisterHandler; import love.sola.netsupport.wechat.handler.SubmitHandler; @@ -21,6 +22,7 @@ public enum Command { REGISTER(0, RegisterHandler.class), QUERY(1, QueryHandler.class), SUBMIT(2, SubmitHandler.class), + CANCEL(3, CancelHandler.class), ; private static final Map ID_MAP = new HashMap<>(); diff --git a/src/main/java/love/sola/netsupport/wechat/handler/CancelHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/CancelHandler.java new file mode 100644 index 0000000..db17640 --- /dev/null +++ b/src/main/java/love/sola/netsupport/wechat/handler/CancelHandler.java @@ -0,0 +1,61 @@ +package love.sola.netsupport.wechat.handler; + +import love.sola.netsupport.enums.Status; +import love.sola.netsupport.pojo.Ticket; +import love.sola.netsupport.pojo.User; +import love.sola.netsupport.sql.SQLCore; +import love.sola.netsupport.sql.TableTicket; +import love.sola.netsupport.sql.TableUser; +import love.sola.netsupport.util.ParseUtil; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutNewsMessage; +import me.chanjar.weixin.mp.bean.outxmlbuilder.NewsBuilder; +import org.hibernate.Session; + +import java.util.Date; +import java.util.Map; + +import static love.sola.netsupport.config.Lang.lang; + +/** + * *********************************************** + * Created by Sola on 2015/12/11. + * Don't modify this source without my agreement + * *********************************************** + */ +public class CancelHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { + User u = TableUser.getUserByWechat(wxMessage.getFromUserName()); + Ticket t = TableTicket.queryLatestOpen(u); + if (t == null) { + return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()) + .content(lang("No_Open_Ticket_Available")).build(); + } + try (Session s = SQLCore.sf.openSession()) { + t.setUpdateTime(new Date()); + t.setDescription(lang("User_Cancel_Remark")); + t.setStatus(Status.SOLVED); + s.beginTransaction(); + s.update(t); + s.getTransaction().commit(); + NewsBuilder out = WxMpXmlOutMessage.NEWS().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); + WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item(); + item.setTitle(lang("Cancel_Title")); + item.setDescription(ParseUtil.parseTicket(t)); + out.addArticle(item); + return out.build(); + } catch (Exception e) { + e.printStackTrace(); + return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()) + .content(lang("Cancel_Failed")).build(); + } + } + +} diff --git a/src/main/java/love/sola/netsupport/wechat/handler/QueryHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/QueryHandler.java index 7762c25..a5569b8 100644 --- a/src/main/java/love/sola/netsupport/wechat/handler/QueryHandler.java +++ b/src/main/java/love/sola/netsupport/wechat/handler/QueryHandler.java @@ -1,11 +1,11 @@ package love.sola.netsupport.wechat.handler; import love.sola.netsupport.api.Authorize; -import love.sola.netsupport.enums.Status; import love.sola.netsupport.pojo.Ticket; import love.sola.netsupport.pojo.User; import love.sola.netsupport.sql.TableTicket; import love.sola.netsupport.sql.TableUser; +import love.sola.netsupport.util.ParseUtil; import love.sola.netsupport.wechat.Command; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.WxSessionManager; @@ -16,7 +16,6 @@ import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; import me.chanjar.weixin.mp.bean.WxMpXmlOutNewsMessage; import me.chanjar.weixin.mp.bean.outxmlbuilder.NewsBuilder; -import java.text.SimpleDateFormat; import java.util.Map; import static love.sola.netsupport.config.Lang.format; @@ -30,12 +29,11 @@ import static love.sola.netsupport.config.Lang.lang; */ public class QueryHandler implements WxMpMessageHandler { - public static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm EEE"); @Override public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { User u = TableUser.getUserByWechat(wxMessage.getFromUserName()); - Ticket t = TableTicket.queryLast(u); + Ticket t = TableTicket.queryLatest(u); if (t == null) { return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()) .content(lang("No_Ticket_Available")).build(); @@ -43,20 +41,9 @@ public class QueryHandler implements WxMpMessageHandler { NewsBuilder out = WxMpXmlOutMessage.NEWS().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item(); - StringBuilder sb = new StringBuilder() - .append(lang("Ticket_Info_Id")).append(t.getId()).append("\n") - .append(lang("Ticket_Info_Desc")).append(t.getDescription()).append("\n") - .append(lang("Ticket_Info_Submit_Time")).append(dateFormat.format(t.getSubmitTime())).append("\n"); - if (t.getUpdateTime() != null) { - sb.append(lang("Ticket_Info_Operator")).append(t.getOperator().getId()).append("\n"); - sb.append(lang("Ticket_Info_Remark")).append(t.getRemark()).append("\n"); - sb.append(lang("Ticket_Info_Update_Time")).append(dateFormat.format(t.getUpdateTime())).append("\n"); - } - sb.append(lang("Ticket_Info_Status")).append(Status.getLocalized(t.getStatus())).append("\n"); - sb.append(lang("More_Details")); - item.setUrl(format("User_Query_Link", wxMessage.getFromUserName())); item.setTitle(lang("Query_Title")); - item.setDescription(sb.toString()); + item.setDescription(ParseUtil.parseTicket(t) + "\n" + lang("More_Details")); + item.setUrl(format("User_Query_Link", wxMessage.getFromUserName())); out.addArticle(item); Authorize.fetchedTime.put(wxMessage.getFromUserName(), System.currentTimeMillis()); Authorize.fetchedCommand.put(wxMessage.getFromUserName(), Command.QUERY); diff --git a/src/main/java/love/sola/netsupport/wechat/handler/SubmitHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/SubmitHandler.java index b4aa5e7..3feca30 100644 --- a/src/main/java/love/sola/netsupport/wechat/handler/SubmitHandler.java +++ b/src/main/java/love/sola/netsupport/wechat/handler/SubmitHandler.java @@ -31,7 +31,7 @@ public class SubmitHandler implements WxMpMessageHandler { @Override public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { User u = TableUser.getUserByWechat(wxMessage.getFromUserName()); - Ticket t = TableTicket.queryLastOpen(u); + Ticket t = TableTicket.queryLatestOpen(u); if (t != null) { return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()) .content(lang("Already_Opening_Ticket")).build(); diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml index d3a93e0..c15b941 100644 --- a/src/main/resources/lang.yml +++ b/src/main/resources/lang.yml @@ -7,6 +7,7 @@ Unknown_Encrypt_Type: 'Unknown encrypt-type.' REGEX_QUERY: '^(?i)(Query)|(查询)|(cx)$' REGEX_REGISTER: '^(?i)(Reg(ister)?)|(注册)|(zc)$' REGEX_SUBMIT: '^(?i)(Submit)|(报修)|(bx)$' +REGEX_CANCEL: '^(?i)(Cancel)|(取消)|(qx)$' #Event Event_Subscribe: "欢迎使用电子科技大学中山学院网络维护科微信自助报修平台。\n如您在使用中遇到任何问题,请将投诉或建议邮件至loli@sola.love." @@ -18,13 +19,6 @@ Already_Registered: "您已进行过微信绑定。如果需要更改个人信 Query_Title: '最近一次报修记录:' More_Details: '查询更早的报修信息,请点击 >' No_Ticket_Available: '您尚未提交过任何报修。' -Ticket_Info_Id: '报修单号: ' -Ticket_Info_Desc: '报修描述: ' -Ticket_Info_Submit_Time: '提交时间: ' -Ticket_Info_Operator: '操作员: ' -Ticket_Info_Remark: '维修描述: ' -Ticket_Info_Update_Time: '更新时间: ' -Ticket_Info_Status: '报修单状态: ' #Submit Already_Opening_Ticket: "您上次提交的报修单仍在处理中. 若需要查询报修单状态,请发送 '查询' 。" Submit_Title: '在网维工作人员上门解决您的问题之前...' @@ -35,6 +29,11 @@ Submit_Desc: "在网维工作人员上门解决您的问题之前,您可以尝 若您的电脑出现明显异常,请尝试使用他人的电脑能否正常登录,网维的工作成员主要负责网络的维护工作,可能无法解决您的个人电脑问题。\n \n 若以上步骤对您没有帮助,请点此提交报修表单。" +#Cancel +No_Open_Ticket_Available: '您当前没有未解决的报修表单。' +Cancel_Title: '报修已取消:' +User_Cancel_Remark: '用户手动取消报修。' +Cancel_Failed: '取消失败。' #URL User_Register_Link: "您尚未进行微信绑定, 请点击这里进行微信绑定操作。" @@ -45,4 +44,12 @@ Result_Page: 'http://topaz.sinaapp.com/nm/v1/result.html' #Localized #Status STATUS_UNCHECKED: '待处理' -STATUS_SOLVED: '已解决' \ No newline at end of file +STATUS_SOLVED: '已解决' +#Ticket +Ticket_Info_Id: '报修单号: ' +Ticket_Info_Desc: '报修描述: ' +Ticket_Info_Submit_Time: '提交时间: ' +Ticket_Info_Operator: '操作员: ' +Ticket_Info_Remark: '维修描述: ' +Ticket_Info_Update_Time: '更新时间: ' +Ticket_Info_Status: '报修单状态: ' \ No newline at end of file