From 18bdff5e42bc010f71d4a0820707e29b4c8500f9 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期一, 20 一月 2025 11:32:31 +0800
Subject: [PATCH] bug修改

---
 common/lib/jna-platform-4.1.0.jar                                                         |    0 
 common/src/main/java/com/jilongda/common/Ticket/TAddOptometryVO.java                      |   28 +
 common/lib/commons-logging-1.2.jar                                                        |    0 
 common/lib/httpclient-cache-4.5.2.jar                                                     |    0 
 common/lib/fluent-hc-4.5.2.jar                                                            |    0 
 common/lib/httpclient-win-4.5.2.jar                                                       |    0 
 common/lib/jna-4.1.0.jar                                                                  |    0 
 common/src/main/java/com/jilongda/common/Ticket/TOptometryDetailVO.java                   |    5 
 optometrist/pom.xml                                                                       |   27 +
 /dev/null                                                                                 |   18 -
 common/lib/httpclient-4.5.2.jar                                                           |    0 
 manage/src/main/java/com/jilongda/manage/controller/TCouponController.java                |  131 ++++++
 common/src/main/java/com/jilongda/common/Ticket/TicketUtil.java                           |  730 ++++++++++++++++++++++++++++++++++++++++
 optometrist/src/main/java/com/jilongda/optometrist/controller/TOptometristController.java |   31 +
 common/lib/httpmime-4.5.2.jar                                                             |    0 
 common/pom.xml                                                                            |   70 +++
 common/lib/httpcore-4.4.4.jar                                                             |    0 
 common/lib/commons-codec-1.9.jar                                                          |    0 
 manage/src/main/java/com/jilongda/manage/controller/TTicketController.java                |   24 +
 19 files changed, 1,024 insertions(+), 40 deletions(-)

diff --git a/common/lib/commons-codec-1.9.jar b/common/lib/commons-codec-1.9.jar
new file mode 100644
index 0000000..ef35f1c
--- /dev/null
+++ b/common/lib/commons-codec-1.9.jar
Binary files differ
diff --git a/common/lib/commons-logging-1.2.jar b/common/lib/commons-logging-1.2.jar
new file mode 100644
index 0000000..93a3b9f
--- /dev/null
+++ b/common/lib/commons-logging-1.2.jar
Binary files differ
diff --git a/common/lib/fluent-hc-4.5.2.jar b/common/lib/fluent-hc-4.5.2.jar
new file mode 100644
index 0000000..f44d04d
--- /dev/null
+++ b/common/lib/fluent-hc-4.5.2.jar
Binary files differ
diff --git a/common/lib/httpclient-4.5.2.jar b/common/lib/httpclient-4.5.2.jar
new file mode 100644
index 0000000..701609f
--- /dev/null
+++ b/common/lib/httpclient-4.5.2.jar
Binary files differ
diff --git a/common/lib/httpclient-cache-4.5.2.jar b/common/lib/httpclient-cache-4.5.2.jar
new file mode 100644
index 0000000..a6f5d31
--- /dev/null
+++ b/common/lib/httpclient-cache-4.5.2.jar
Binary files differ
diff --git a/common/lib/httpclient-win-4.5.2.jar b/common/lib/httpclient-win-4.5.2.jar
new file mode 100644
index 0000000..8f62f67
--- /dev/null
+++ b/common/lib/httpclient-win-4.5.2.jar
Binary files differ
diff --git a/common/lib/httpcore-4.4.4.jar b/common/lib/httpcore-4.4.4.jar
new file mode 100644
index 0000000..ac4a877
--- /dev/null
+++ b/common/lib/httpcore-4.4.4.jar
Binary files differ
diff --git a/common/lib/httpmime-4.5.2.jar b/common/lib/httpmime-4.5.2.jar
new file mode 100644
index 0000000..474670a
--- /dev/null
+++ b/common/lib/httpmime-4.5.2.jar
Binary files differ
diff --git a/common/lib/jna-4.1.0.jar b/common/lib/jna-4.1.0.jar
new file mode 100644
index 0000000..b1a3922
--- /dev/null
+++ b/common/lib/jna-4.1.0.jar
Binary files differ
diff --git a/common/lib/jna-platform-4.1.0.jar b/common/lib/jna-platform-4.1.0.jar
new file mode 100644
index 0000000..8d5fe3d
--- /dev/null
+++ b/common/lib/jna-platform-4.1.0.jar
Binary files differ
diff --git a/common/pom.xml b/common/pom.xml
index f276c02..36c6d1d 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -19,6 +19,76 @@
 
     <dependencies>
         <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.9</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/commons-codec-1.9.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>1.2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/commons-logging-1.2.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>fluent-hc</groupId>
+            <artifactId>fluent-hc</artifactId>
+            <version>4.5.2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/fluent-hc-4.5.2.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>httpclient</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/httpclient-4.5.2.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>httpclient-cache</groupId>
+            <artifactId>httpclient-cache</artifactId>
+            <version>4.5.2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/httpclient-cache-4.5.2.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>httpclient-win</groupId>
+            <artifactId>httpclient-win</artifactId>
+            <version>4.5.2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/httpclient-win-4.5.2.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>httpcore</groupId>
+            <artifactId>httpcore</artifactId>
+            <version>4.4.4</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/httpcore-4.4.4.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>httpmime</groupId>
+            <artifactId>httpmime</artifactId>
+            <version>4.5.2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/httpmime-4.5.2.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>jna</groupId>
+            <artifactId>jna</artifactId>
+            <version>4.1.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/jna-4.1.0.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>jna-platform</groupId>
+            <artifactId>jna-platform</artifactId>
+            <version>4.1.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/jna-platform-4.1.0.jar</systemPath>
+        </dependency>
+        <dependency>
             <groupId>com.alipay.sdk</groupId>
             <artifactId>alipay-sdk-java</artifactId>
             <version>4.8.10.ALL</version>
diff --git a/common/src/main/java/com/jilongda/common/Ticket/TAddOptometryVO.java b/common/src/main/java/com/jilongda/common/Ticket/TAddOptometryVO.java
new file mode 100644
index 0000000..e37e48e
--- /dev/null
+++ b/common/src/main/java/com/jilongda/common/Ticket/TAddOptometryVO.java
@@ -0,0 +1,28 @@
+package com.jilongda.common.Ticket;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "添加验光单VO")
+public class TAddOptometryVO {
+
+    @ApiModelProperty(value = "预约id")
+    private Integer id;
+    @ApiModelProperty(value = "验光单详情")
+    private List<TOptometryDetailVO> optometryDetailVOS;
+    @ApiModelProperty(value = "门店名称")
+    private String shopName;
+    @ApiModelProperty(value = "验光师名称")
+    private String optometristName;
+    @ApiModelProperty(value = "验光时间")
+    private String time;
+    @ApiModelProperty(value = "客户电话")
+    private String phone;
+    @ApiModelProperty(value = "小票机编号")
+    private String sn;
+}
diff --git a/optometrist/src/main/java/com/jilongda/optometrist/vo/TOptometryDetailVO.java b/common/src/main/java/com/jilongda/common/Ticket/TOptometryDetailVO.java
similarity index 85%
rename from optometrist/src/main/java/com/jilongda/optometrist/vo/TOptometryDetailVO.java
rename to common/src/main/java/com/jilongda/common/Ticket/TOptometryDetailVO.java
index 5af6c24..041bbf9 100644
--- a/optometrist/src/main/java/com/jilongda/optometrist/vo/TOptometryDetailVO.java
+++ b/common/src/main/java/com/jilongda/common/Ticket/TOptometryDetailVO.java
@@ -1,7 +1,5 @@
-package com.jilongda.optometrist.vo;
+package com.jilongda.common.Ticket;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.jilongda.optometrist.model.TLineUp;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -36,6 +34,5 @@
 
     @ApiModelProperty(value = "左眼右眼 1为L 2为R")
     private Integer status;
-
 
 }
diff --git a/common/src/main/java/com/jilongda/common/Ticket/TicketUtil.java b/common/src/main/java/com/jilongda/common/Ticket/TicketUtil.java
new file mode 100644
index 0000000..65d94be
--- /dev/null
+++ b/common/src/main/java/com/jilongda/common/Ticket/TicketUtil.java
@@ -0,0 +1,730 @@
+package com.jilongda.common.Ticket;
+
+
+import cn.hutool.crypto.digest.DigestUtil;
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+public class TicketUtil {
+		
+		public static final String URL = "http://api.feieyun.cn/Api/Open/";//不需要修改
+		
+		public static final String USER = "yanduyanjing@163.com";//*必填*:账号名
+		public static final String UKEY = "C8cNbhZ63YWtQDGQ";//*必填*: 飞鹅云后台注册账号后生成的UKEY 【备注:这不是填打印机的KEY】
+		public static final String SN = "*********";//*必填*:打印机编号,必须要在管理后台里添加打印机或调用API接口添加之后,才能调用API
+		
+		
+		//**********测试时,打开下面注释掉方法的即可,更多接口文档信息,请访问官网开放平台查看**********
+		public static void main(String[] args) throws Exception{
+			
+			//==================添加打印机接口(支持批量)==================
+			//***返回值JSON字符串***
+			//正确例子:{"msg":"ok","ret":0,"data":{"ok":["sn#key#remark#carnum","316500011#abcdefgh#快餐前台"],"no":["316500012#abcdefgh#快餐前台#13688889999  (错误:识别码不正确)"]},"serverExecutedTime":3}
+			//错误:{"msg":"参数错误 : 该帐号未注册.","ret":-2,"data":null,"serverExecutedTime":37}
+
+			//提示:打印机编号(必填) # 打印机识别码(必填) # 备注名称(选填) # 流量卡号码(选填),多台打印机请换行(\n)添加新打印机信息,每次最多100行(台)。
+//			String snlist = "922440578#XZacTCZT#测试添加打印机";
+//			String method = addprinter(snlist);
+//			System.out.println(method);
+// 			String snlist = "922440578#XZacTCZT#测试添加打印机";
+//			String method = editprinter("922440578","修改名称");
+//			System.out.println(method);
+
+			TAddOptometryVO tAddOptometryVO = new TAddOptometryVO();
+			List<TOptometryDetailVO> temp = new ArrayList<>();
+			TOptometryDetailVO t1 = new TOptometryDetailVO();
+			t1.setType(3);
+			t1.setBallMirror(-1.00D);
+			t1.setColumnMirror(-0.10D);
+			t1.setAxis("30");
+			t1.setPupilDistance("33");
+			t1.setStatus(1);
+			temp.add(t1);
+			TOptometryDetailVO t2 = new TOptometryDetailVO();
+			t2.setType(3);
+			t2.setBallMirror(-1.00D);
+			t2.setColumnMirror(-0.10D);
+			t2.setAxis("30");
+			t2.setPupilDistance("33");
+			t2.setStatus(2);
+			temp.add(t2);
+			TOptometryDetailVO t3 = new TOptometryDetailVO();
+			t3.setType(2);
+			t3.setBallMirror(-1.00D);
+			t3.setColumnMirror(-0.10D);
+			t3.setAxis("30");
+			t3.setPupilDistance("33");
+			t3.setCorrect("1.0");
+			t3.setStatus(1);
+			temp.add(t3);
+			TOptometryDetailVO t4 =  new TOptometryDetailVO();
+			t4.setType(2);
+			t4.setBallMirror(-1.00D);
+			t4.setColumnMirror(-0.10D);
+			t4.setAxis("30");
+			t4.setPupilDistance("33");
+			t4.setCorrect("1.0");
+			t4.setStatus(2);
+			temp.add(t4);
+			TOptometryDetailVO t5 = new TOptometryDetailVO();
+			t5.setType(1);
+			t5.setBallMirror(-1.00D);
+			t5.setColumnMirror(-0.10D);
+			t5.setAxis("30");
+			t5.setAddS("50");
+			t5.setPupilHeight("50");
+			t5.setPupilDistance("33");
+			t5.setCorrect("1.0");
+			t5.setStatus(1);
+			temp.add(t5);
+			TOptometryDetailVO t6 = new TOptometryDetailVO();
+			t6.setType(1);
+			t6.setBallMirror(-1.00D);
+			t6.setColumnMirror(-0.10D);
+			t6.setAxis("30");
+			t6.setAddS("50");
+			t6.setPupilHeight("50");
+			t6.setPupilDistance("33");
+			t6.setCorrect("1.0");
+			t6.setStatus(2);
+			temp.add(t6);
+
+			tAddOptometryVO.setOptometryDetailVOS(temp);
+			tAddOptometryVO.setShopName("天府新谷门店");
+			tAddOptometryVO.setOptometristName("无关风月");
+			tAddOptometryVO.setTime("2025-11-11");
+			tAddOptometryVO.setPhone("19983174515");
+			tAddOptometryVO.setSn("922440578");
+			String method = print(tAddOptometryVO);
+			System.out.println(method);
+
+			
+			//==================方法1.小票机打印订单接口==================
+			//***返回值JSON字符串***
+			//成功:{"msg":"ok","ret":0,"data":"xxxxxxx_xxxxxxxx_xxxxxxxx","serverExecutedTime":5}
+			//失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}
+			
+//			String method1 = print(SN);//该接口只能是小票机使用,如购买的是标签机请使用下面方法2,调用打印
+//			System.out.println(method1);
+
+			
+			
+			//==================方法2.标签机专用打印订单接口==================
+			//***返回值JSON字符串***
+			//成功:{"msg":"ok","ret":0,"data":"xxxxxxx_xxxxxxxx_xxxxxxxx","serverExecutedTime":5}
+			//失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}
+			
+//			String method2 = printLabelMsg(SN);//打开注释调用标签机打印接口进行打印,该接口只能是标签机使用,其它型号打印机请勿使用该接口
+//			System.out.println(method2);
+			
+			
+			
+			//===========方法3.查询某订单是否打印成功=============
+			//***返回值JSON字符串***
+		 	//成功:{"msg":"ok","ret":0,"data":true,"serverExecutedTime":2}//data:true为已打印,false为未打印
+			//失败:{"msg":"错误描述","ret":非0, "data":null,"serverExecutedTime":7}
+			
+//			String orderid = "xxxxxxx_xxxxxxxx_xxxxxxxx";//订单ID,从方法1返回值data获取
+//			String method3 = queryOrderState(orderid);
+//			System.out.println(method3);
+			
+			
+			
+			//===========方法4.查询指定打印机某天的订单详情============
+			//***返回值JSON字符串***
+			//成功:{"msg":"ok","ret":0,"data":{"print":6,"waiting":1},"serverExecutedTime":9}//print已打印,waiting为打印
+			//失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}
+			
+//			String strdate = "2016-11-12";//注意时间格式为"yyyy-MM-dd"
+//			String method4 = queryOrderInfoByDate(SN,strdate);
+//			System.out.println(method4);
+			
+			
+			
+			//===========方法5.查询打印机的状态==========================
+			//***返回值JSON字符串***
+		    //成功:{"msg":"ok","ret":0,"data":"状态","serverExecutedTime":4}
+			//失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}
+			
+//			String method5 = queryPrinterStatus(SN);
+//			System.out.println(method5);
+			
+		}
+	public static String unescapeUnicode(String input) {
+		Pattern pattern = Pattern.compile("\\\\u([0-9a-fA-F]{4})");
+		Matcher matcher = pattern.matcher(input);
+		StringBuffer sb = new StringBuffer();
+
+		while (matcher.find()) {
+			int codePoint = Integer.parseInt(matcher.group(1), 16);
+			matcher.appendReplacement(sb, String.valueOf((char) codePoint));
+		}
+		matcher.appendTail(sb);
+
+		return sb.toString();
+	}
+
+
+
+		
+		//=====================以下是函数实现部分================================================
+		
+		public static  String addprinter(String snlist){
+			
+		   //通过POST请求,发送打印信息到服务器
+			RequestConfig requestConfig = RequestConfig.custom()  
+		            .setSocketTimeout(30000)//读取超时  
+		            .setConnectTimeout(30000)//连接超时
+		            .build();
+			
+			CloseableHttpClient httpClient = HttpClients.custom()
+					 .setDefaultRequestConfig(requestConfig)
+					 .build();	
+			
+		    HttpPost post = new HttpPost(URL);
+	        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+			nvps.add(new BasicNameValuePair("user",USER));
+			String STIME = String.valueOf(System.currentTimeMillis()/1000);
+			nvps.add(new BasicNameValuePair("stime",STIME));
+			nvps.add(new BasicNameValuePair("sig",signature(USER,UKEY,STIME)));
+			nvps.add(new BasicNameValuePair("apiname","Open_printerAddlist"));//固定值,不需要修改
+			nvps.add(new BasicNameValuePair("printerContent",snlist));
+			
+			CloseableHttpResponse response = null;
+			String result = null;
+	        try
+	        {
+	    	   post.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));
+	    	   response = httpClient.execute(post);
+	       	   int statecode = response.getStatusLine().getStatusCode();
+	       	   if(statecode == 200){
+		        	HttpEntity httpentity = response.getEntity(); 
+		            if (httpentity != null){
+		            	result = EntityUtils.toString(httpentity);
+		            }
+	           }
+	       }
+	       catch (Exception e)
+	       {
+	    	   e.printStackTrace();
+	       }
+	       finally{
+	    	   try {
+	    		   if(response!=null){
+	    			   response.close();
+	    		   }
+	    	   } catch (IOException e) {
+	    		   e.printStackTrace();
+	    	   }
+	    	   try {
+	    		   post.abort();
+	    	   } catch (Exception e) {
+	    		   e.printStackTrace();
+	    	   }
+	    	   try {
+	    		   httpClient.close();
+	    	   } catch (IOException e) {
+	    		   e.printStackTrace();
+	    	   }
+	       }
+
+			// 解析JSON字符串
+	       return unescapeUnicode(result);
+		  
+		}
+		public static  String editprinter(String sn,String name){
+
+		   //通过POST请求,发送打印信息到服务器
+			RequestConfig requestConfig = RequestConfig.custom()
+		            .setSocketTimeout(30000)//读取超时
+		            .setConnectTimeout(30000)//连接超时
+		            .build();
+
+			CloseableHttpClient httpClient = HttpClients.custom()
+					 .setDefaultRequestConfig(requestConfig)
+					 .build();
+
+		    HttpPost post = new HttpPost(URL);
+	        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+			nvps.add(new BasicNameValuePair("user",USER));
+			String STIME = String.valueOf(System.currentTimeMillis()/1000);
+			nvps.add(new BasicNameValuePair("stime",STIME));
+			nvps.add(new BasicNameValuePair("sig",signature(USER,UKEY,STIME)));
+			nvps.add(new BasicNameValuePair("apiname","Open_printerEdit"));//固定值,不需要修改
+			nvps.add(new BasicNameValuePair("sn",sn));
+			nvps.add(new BasicNameValuePair("name",name));
+
+			CloseableHttpResponse response = null;
+			String result = null;
+	        try
+	        {
+	    	   post.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));
+	    	   response = httpClient.execute(post);
+	       	   int statecode = response.getStatusLine().getStatusCode();
+	       	   if(statecode == 200){
+		        	HttpEntity httpentity = response.getEntity();
+		            if (httpentity != null){
+		            	result = EntityUtils.toString(httpentity);
+		            }
+	           }
+	       }
+	       catch (Exception e)
+	       {
+	    	   e.printStackTrace();
+	       }
+	       finally{
+	    	   try {
+	    		   if(response!=null){
+	    			   response.close();
+	    		   }
+	    	   } catch (IOException e) {
+	    		   e.printStackTrace();
+	    	   }
+	    	   try {
+	    		   post.abort();
+	    	   } catch (Exception e) {
+	    		   e.printStackTrace();
+	    	   }
+	    	   try {
+	    		   httpClient.close();
+	    	   } catch (IOException e) {
+	    		   e.printStackTrace();
+	    	   }
+	       }
+	       return unescapeUnicode(result);
+
+		}
+				
+				
+		//方法1
+		public static String print(TAddOptometryVO dto){
+			//标签说明:
+			//单标签: 
+			//"<BR>"为换行,"<CUT>"为切刀指令(主动切纸,仅限切刀打印机使用才有效果)
+			//"<LOGO>"为打印LOGO指令(前提是预先在机器内置LOGO图片),"<PLUGIN>"为钱箱或者外置音响指令
+			//成对标签:
+			//"<CB></CB>"为居中放大一倍,"<B></B>"为放大一倍,"<C></C>"为居中,<L></L>字体变高一倍
+			//<W></W>字体变宽一倍,"<QR></QR>"为二维码,"<BOLD></BOLD>"为字体加粗,"<RIGHT></RIGHT>"为右对齐
+			//拼凑订单内容时可参考如下格式
+			//根据打印纸张的宽度,自行调整内容的格式,可参考下面的样例格式
+			
+			StringBuilder content;
+			content=new StringBuilder("<BOLD>");
+			content.append("隼目验光单<BR>");
+			content.append(dto.getShopName()).append("<BR>");
+			content.append("验光师:").append(dto.getOptometristName()).append("<BR>");
+			content.append("验光时间:").append(dto.getTime()).append("<BR>");
+			content.append("--------------------------------<BR>");
+			content.append("客户电话:").append(dto.getPhone()).append("<BR>");
+			content.append("--------------------------------<BR>");
+			List<TOptometryDetailVO> optometryDetailVOS = dto.getOptometryDetailVOS();
+			// 使用 List.sort 和 Comparator 进行多字段倒序排序
+			optometryDetailVOS.sort(
+					Comparator.comparingInt(TOptometryDetailVO::getType)
+							.thenComparingInt(TOptometryDetailVO::getStatus).reversed()
+			);
+			for (TOptometryDetailVO s : optometryDetailVOS) {
+				switch (s.getType()){
+					case 3:
+						if (s.getStatus()==2){
+							content.append("<BOLD>旧镜信息<BR>");
+							content.append("R:<BR>");
+							content.append("度数:"+s.getBallMirror()+" 散光:"+s.getColumnMirror()+" 轴位:"+s.getAxis()+"<BR>");
+							content.append("瞳距:"+s.getPupilDistance()+"<BR>");
+						}else if (s.getStatus()==1){
+							content.append("L:<BR>");
+							content.append("度数:"+s.getBallMirror()+" 散光:"+s.getColumnMirror()+" 轴位:"+s.getAxis()+"<BR>");
+							content.append("瞳距:"+s.getPupilDistance()+"<BR>");
+							content.append("--------------------------------<BR>");
+						}
+						break;
+					case 2:
+						if (s.getStatus()==2){
+							content.append("完全矫正<BR>");
+							content.append("R:<BR>");
+							content.append("度数:"+s.getBallMirror()+" 散光:"+s.getColumnMirror()+" 轴位:"+s.getAxis()+"<BR>");
+							content.append("瞳距:"+s.getPupilDistance()+" 矫正:"+s.getCorrect()+"<BR>");
+						}else if (s.getStatus()==1){
+							content.append("L:<BR>");
+							content.append("度数:"+s.getBallMirror()+" 散光:"+s.getColumnMirror()+" 轴位:"+s.getAxis()+"<BR>");
+							content.append("瞳距:"+s.getPupilDistance()+" 矫正:"+s.getCorrect()+"<BR>");
+							content.append("--------------------------------<BR>");
+						}
+						break;
+					case 1:
+						if (s.getStatus()==2){
+							content.append("配镜处方<BR>");
+							content.append("R:<BR>");
+							content.append("度数:"+s.getBallMirror()+" 散光:"+s.getColumnMirror()+" 轴位:"+s.getAxis()+"<BR>");
+							content.append("ADD:"+s.getAddS()+" 瞳距:"+s.getPupilDistance()+" 瞳高:"+s.getPupilHeight()+"<BR>");
+							content.append("矫正:"+s.getCorrect()+"<BR>");
+						}else if (s.getStatus()==1){
+							content.append("L:<BR>");
+							content.append("度数:"+s.getBallMirror()+" 散光:"+s.getColumnMirror()+" 轴位:"+s.getAxis()+"<BR>");
+							content.append("ADD:"+s.getAddS()+" 瞳距:"+s.getPupilDistance()+" 瞳高:"+s.getPupilHeight()+"<BR>");
+							content.append("矫正:"+s.getCorrect()+"<BR>");
+							content.append("--------------------------------<BR>");
+						}
+						break;
+				}
+			}
+			content.append("</BOLD>");
+		   //通过POST请求,发送打印信息到服务器
+			RequestConfig requestConfig = RequestConfig.custom()  
+		            .setSocketTimeout(30000)//读取超时  
+		            .setConnectTimeout(30000)//连接超时
+		            .build();
+			
+			CloseableHttpClient httpClient = HttpClients.custom()
+					 .setDefaultRequestConfig(requestConfig)
+					 .build();	
+			
+		    HttpPost post = new HttpPost(URL);
+	        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+			nvps.add(new BasicNameValuePair("user",USER));
+			String STIME = String.valueOf(System.currentTimeMillis()/1000);
+			nvps.add(new BasicNameValuePair("stime",STIME));
+			nvps.add(new BasicNameValuePair("sig",signature(USER,UKEY,STIME)));
+			nvps.add(new BasicNameValuePair("apiname","Open_printMsg"));//固定值,不需要修改
+			nvps.add(new BasicNameValuePair("sn",dto.getSn()));
+			nvps.add(new BasicNameValuePair("content", content.toString()));
+			nvps.add(new BasicNameValuePair("times","1"));//打印联数
+			
+			CloseableHttpResponse response = null;
+			String result = null;
+	        try
+	        {
+	    	   post.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));
+	    	   response = httpClient.execute(post);
+	       	   int statecode = response.getStatusLine().getStatusCode();
+	       	   if(statecode == 200){
+		        	HttpEntity httpentity = response.getEntity(); 
+		            if (httpentity != null){
+		            	//服务器返回的JSON字符串,建议要当做日志记录起来
+		            	result = EntityUtils.toString(httpentity);
+		            }
+	           }
+	       }
+	       catch (Exception e)
+	       {
+	    	   e.printStackTrace();
+	       }
+	       finally{
+	    	   try {
+	    		   if(response!=null){
+	    			   response.close();
+	    		   }
+	    	   } catch (IOException e) {
+	    		   e.printStackTrace();
+	    	   }
+	    	   try {
+	    		   post.abort();
+	    	   } catch (Exception e) {
+	    		   e.printStackTrace();
+	    	   }
+	    	   try {
+	    		   httpClient.close();
+	    	   } catch (IOException e) {
+	    		   e.printStackTrace();
+	    	   }
+	       }
+			return unescapeUnicode(result);
+		  
+		}
+		
+		
+		
+		//方法2
+		public static String printLabelMsg(String sn){
+			
+			String content;
+			content = "<DIRECTION>1</DIRECTION>";//设定打印时出纸和打印字体的方向,n 0 或 1,每次设备重启后都会初始化为 0 值设置,1:正向出纸,0:反向出纸,
+			content += "<TEXT x='9' y='10' font='12' w='1' h='2' r='0'>#001       五号桌      1/3</TEXT><TEXT x='80' y='80' font='12' w='2' h='2' r='0'>可乐鸡翅</TEXT><TEXT x='9' y='180' font='12' w='1' h='1' r='0'>张三先生       13800138000</TEXT>";//40mm宽度标签纸打印例子,打开注释调用标签打印接口打印
+			
+		   //通过POST请求,发送打印信息到服务器
+			RequestConfig requestConfig = RequestConfig.custom()  
+		            .setSocketTimeout(30000)//读取超时  
+		            .setConnectTimeout(30000)//连接超时
+		            .build();
+			
+			CloseableHttpClient httpClient = HttpClients.custom()
+					 .setDefaultRequestConfig(requestConfig)
+					 .build();	
+			
+		    HttpPost post = new HttpPost(URL);
+	        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+			nvps.add(new BasicNameValuePair("user",USER));
+			String STIME = String.valueOf(System.currentTimeMillis()/1000);
+			nvps.add(new BasicNameValuePair("stime",STIME));
+			nvps.add(new BasicNameValuePair("sig",signature(USER,UKEY,STIME)));
+			nvps.add(new BasicNameValuePair("apiname","Open_printLabelMsg"));//固定值,不需要修改
+			nvps.add(new BasicNameValuePair("sn",sn));
+			nvps.add(new BasicNameValuePair("content",content));
+			nvps.add(new BasicNameValuePair("times","1"));//打印联数
+			
+			CloseableHttpResponse response = null;
+			String result = null;
+	        try
+	        {
+	    	   post.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));
+	    	   response = httpClient.execute(post);
+	       	   int statecode = response.getStatusLine().getStatusCode();
+	       	   if(statecode == 200){
+		        	HttpEntity httpentity = response.getEntity(); 
+		            if (httpentity != null){
+		            	//服务器返回的JSON字符串,建议要当做日志记录起来
+		            	result = EntityUtils.toString(httpentity);
+		            }
+	           }
+	       }
+	       catch (Exception e)
+	       {
+	    	   e.printStackTrace();
+	       }
+	       finally{
+	    	   try {
+	    		   if(response!=null){
+	    			   response.close();
+	    		   }
+	    	   } catch (IOException e) {
+	    		   e.printStackTrace();
+	    	   }
+	    	   try {
+	    		   post.abort();
+	    	   } catch (Exception e) {
+	    		   e.printStackTrace();
+	    	   }
+	    	   try {
+	    		   httpClient.close();
+	    	   } catch (IOException e) {
+	    		   e.printStackTrace();
+	    	   }
+	       }
+	       return result;
+		  
+		}
+
+		
+		//方法3
+		public static String queryOrderState(String orderid){
+		
+		   //通过POST请求,发送打印信息到服务器
+			RequestConfig requestConfig = RequestConfig.custom()  
+		            .setSocketTimeout(30000)//读取超时  
+		            .setConnectTimeout(30000)//连接超时
+		            .build();
+			
+			CloseableHttpClient httpClient = HttpClients.custom()
+					 .setDefaultRequestConfig(requestConfig)
+					 .build();	
+			
+		    HttpPost post = new HttpPost(URL);
+	        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+			nvps.add(new BasicNameValuePair("user",USER));
+			String STIME = String.valueOf(System.currentTimeMillis()/1000);
+			nvps.add(new BasicNameValuePair("stime",STIME));
+			nvps.add(new BasicNameValuePair("sig",signature(USER,UKEY,STIME)));
+			nvps.add(new BasicNameValuePair("apiname","Open_queryOrderState"));//固定值,不需要修改
+			nvps.add(new BasicNameValuePair("orderid",orderid));
+			
+			CloseableHttpResponse response = null;
+			String result = null;
+	        try
+	        {
+	    	   post.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));
+	       	   response = httpClient.execute(post);
+	       	   int statecode = response.getStatusLine().getStatusCode();
+	       	   if(statecode == 200){
+		        	HttpEntity httpentity = response.getEntity(); 
+		            if (httpentity != null){
+		            	//服务器返回
+		            	result = EntityUtils.toString(httpentity);
+		            }
+	           }
+	       }
+	       catch (Exception e)
+	       {
+	    	   e.printStackTrace();
+	       }
+	        finally{
+		    	   try {
+		    		   if(response!=null){
+		    			   response.close();
+		    		   }
+		    	   } catch (IOException e) {
+		    		   e.printStackTrace();
+		    	   }
+		    	   try {
+		    		   post.abort();
+		    	   } catch (Exception e) {
+		    		   e.printStackTrace();
+		    	   }
+		    	   try {
+		    		   httpClient.close();
+		    	   } catch (IOException e) {
+		    		   e.printStackTrace();
+		    	   }
+		       }
+	       return result;
+	  
+	   }
+
+		
+		
+		//方法4
+		public static String queryOrderInfoByDate(String sn,String strdate){
+		
+		    //通过POST请求,发送打印信息到服务器
+			RequestConfig requestConfig = RequestConfig.custom()  
+		            .setSocketTimeout(30000)//读取超时  
+		            .setConnectTimeout(30000)//连接超时
+		            .build();
+			
+			CloseableHttpClient httpClient = HttpClients.custom()
+					 .setDefaultRequestConfig(requestConfig)
+					 .build();	
+			
+		    HttpPost post = new HttpPost(URL);
+	        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+			nvps.add(new BasicNameValuePair("user",USER));
+			String STIME = String.valueOf(System.currentTimeMillis()/1000);
+			nvps.add(new BasicNameValuePair("stime",STIME));
+			nvps.add(new BasicNameValuePair("sig",signature(USER,UKEY,STIME)));
+			nvps.add(new BasicNameValuePair("apiname","Open_queryOrderInfoByDate"));//固定值,不需要修改
+			nvps.add(new BasicNameValuePair("sn",sn));
+			nvps.add(new BasicNameValuePair("date",strdate));//yyyy-MM-dd格式
+			
+			CloseableHttpResponse response = null;
+			String result = null;
+	        try
+	        {
+	    	   post.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));
+	       	   response = httpClient.execute(post);
+	       	   int statecode = response.getStatusLine().getStatusCode();
+	       	   if(statecode == 200){
+		        	HttpEntity httpentity = response.getEntity(); 
+		            if (httpentity != null){
+		            	//服务器返回
+		            	result = EntityUtils.toString(httpentity);
+		            }
+	           }
+	       }
+	       catch (Exception e)
+	       {
+	    	   e.printStackTrace();
+	       }
+	        finally{
+		    	   try {
+		    		   if(response!=null){
+		    			   response.close();
+		    		   }
+		    	   } catch (IOException e) {
+		    		   e.printStackTrace();
+		    	   }
+		    	   try {
+		    		   post.abort();
+		    	   } catch (Exception e) {
+		    		   e.printStackTrace();
+		    	   }
+		    	   try {
+		    		   httpClient.close();
+		    	   } catch (IOException e) {
+		    		   e.printStackTrace();
+		    	   }
+		       }
+	       return result;
+	  
+	   }
+		
+		
+		
+		//方法5
+		public static String queryPrinterStatus(String sn){
+		
+		    //通过POST请求,发送打印信息到服务器
+			RequestConfig requestConfig = RequestConfig.custom()  
+		            .setSocketTimeout(30000)//读取超时  
+		            .setConnectTimeout(30000)//连接超时
+		            .build();
+			
+			CloseableHttpClient httpClient = HttpClients.custom()
+					 .setDefaultRequestConfig(requestConfig)
+					 .build();	
+			
+		    HttpPost post = new HttpPost(URL);
+	        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+			nvps.add(new BasicNameValuePair("user",USER));
+			String STIME = String.valueOf(System.currentTimeMillis()/1000);
+			nvps.add(new BasicNameValuePair("stime",STIME));
+			nvps.add(new BasicNameValuePair("sig",signature(USER,UKEY,STIME)));
+			nvps.add(new BasicNameValuePair("apiname","Open_queryPrinterStatus"));//固定值,不需要修改
+			nvps.add(new BasicNameValuePair("sn",sn));
+			
+			CloseableHttpResponse response = null;
+			String result = null;
+	        try
+	        {
+	    	   post.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));
+	       	   response = httpClient.execute(post);
+	       	   int statecode = response.getStatusLine().getStatusCode();
+	       	   if(statecode == 200){
+		        	HttpEntity httpentity = response.getEntity(); 
+		            if (httpentity != null){
+		            	//服务器返回
+		            	result = EntityUtils.toString(httpentity);
+		            }
+	           }
+	       }
+	       catch (Exception e)
+	       {
+	    	   e.printStackTrace();
+	       }
+	        finally{
+		    	   try {
+		    		   if(response!=null){
+		    			   response.close();
+		    		   }
+		    	   } catch (IOException e) {
+		    		   e.printStackTrace();
+		    	   }
+		    	   try {
+		    		   post.abort();
+		    	   } catch (Exception e) {
+		    		   e.printStackTrace();
+		    	   }
+		    	   try {
+		    		   httpClient.close();
+		    	   } catch (IOException e) {
+		    		   e.printStackTrace();
+		    	   }
+		       }
+	       return result;
+	  
+	   }
+		
+		
+		//生成签名字符串
+		public static String signature(String USER,String UKEY,String STIME){
+			String s = DigestUtil.sha1Hex(USER+UKEY+STIME);
+			return s;
+		}
+		
+	
+}
\ No newline at end of file
diff --git a/manage/src/main/java/com/jilongda/manage/controller/TCouponController.java b/manage/src/main/java/com/jilongda/manage/controller/TCouponController.java
index e7715b0..df84469 100644
--- a/manage/src/main/java/com/jilongda/manage/controller/TCouponController.java
+++ b/manage/src/main/java/com/jilongda/manage/controller/TCouponController.java
@@ -1,10 +1,18 @@
 package com.jilongda.manage.controller;
 
 
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.common.utils.BinaryUtil;
+import com.aliyun.oss.model.MatchMode;
+import com.aliyun.oss.model.OSSObject;
+import com.aliyun.oss.model.PolicyConditions;
+import com.aliyun.oss.model.PutObjectResult;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.jilongda.common.basic.ApiResult;
 import com.jilongda.common.basic.PageInfo;
 import com.jilongda.common.utils.UUIDUtil;
+import com.jilongda.manage.component.AliOssMange;
 import com.jilongda.manage.dto.TModelDTO;
 import com.jilongda.manage.model.TAppUser;
 import com.jilongda.manage.model.TCoupon;
@@ -28,22 +36,18 @@
 import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.util.StringUtils;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -188,5 +192,116 @@
 
         return multipartFile;
     }
+    @ApiOperation(value = "服务端上传", notes = "服务端上传")
+    @PostMapping(value = "upload")
+    public ApiResult<String> fileUpload(@RequestParam(value = "file") MultipartFile file) throws IOException {
+        InputStream inputStream = file.getInputStream();
+        String filename = System.currentTimeMillis() + file.getOriginalFilename();
+        // Endpoint以杭州为例,其它Region请按实际情况填写。
+        final String endpoint = AliOssMange.endpoint;
+        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
+        final String accessKeyId = AliOssMange.accessKeyId;
+        final String accessKeySecret = AliOssMange.accessKeySecret;
+        final String bucketName = AliOssMange.bucketName;
+        // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
+        String objectName = AliOssMange.dir + filename;
+        // 创建OSSClient实例。
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
+        // InputStream inputStream = new FileInputStream("D:\\localpath\\examplefile.txt");
+        // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。Object完整路径中不能包含Bucket名称。
+        PutObjectResult putObjectResult = ossClient.putObject(bucketName, objectName, inputStream);
+        OSSObject ossObject = ossClient.getObject(bucketName, objectName);
+        String uri = ossObject.getResponse().getUri();
+        // 关闭OSSClient。
+        ossClient.shutdown();
+//        uri = uri.replace("http://nn-bucket.oss-cn-shanghai.aliyuncs.com",FILE_CDN);
+        return ApiResult.okmsg(uri);
+    }
+
+
+    @ApiOperation(value = "服务端签名后直传", notes = "服务端签名后直传")
+    @PostMapping("signature")
+    public ApiResult<Map<String, String>> signature() {
+        OSS builder = new OSSClientBuilder().build(AliOssMange.endpoint, AliOssMange.accessKeyId, AliOssMange.accessKeySecret);
+        long expireTime = 30;
+        long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
+        Date expiration = new Date(expireEndTime);
+        PolicyConditions policyConds = new PolicyConditions();
+        policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
+        policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, AliOssMange.dir);
+        String postPolicy = builder.generatePostPolicy(expiration, policyConds);
+        byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
+        String encodedPolicy = BinaryUtil.toBase64String(binaryData);
+        String postSignature = builder.calculatePostSignature(postPolicy);
+        Map<String, String> respMap = new LinkedHashMap<>(6);
+        respMap.put("accessid", AliOssMange.accessKeyId);
+        respMap.put("policy", encodedPolicy);
+        respMap.put("signature", postSignature);
+        // 示例为dir
+        respMap.put("dir", AliOssMange.dir);
+        // 前端为key
+        // respMap.put("key", AliOssMange.dir);
+        respMap.put("host", AliOssMange.host);
+//        respMap.put("cdn", AliOssMange.cdn);
+        respMap.put("expire", String.valueOf(expireEndTime / 1000));
+//        // 回调
+//        if (StringUtils.hasLength(AliOssMange.callbackUrl)) {
+//            JSONObject jasonCallback = new JSONObject();
+//            jasonCallback.put("callbackUrl", AliOssMange.callbackUrl);
+//            String callbackBody = "{\"filename\":${object},\"size\":${size},\"mimeType\":${mimeType}}";
+//            jasonCallback.put("callbackBody", callbackBody);
+//            jasonCallback.put("callbackBodyType", "application/json");
+//            String base64CallbackBody = BinaryUtil.toBase64String(jasonCallback.toString().getBytes());
+//            respMap.put("callback", base64CallbackBody);
+//        }
+
+//        HttpServletResponse response = WebUtils.response();
+//        assert response != null;
+//        response.setHeader("Access-Control-Allow-Origin", "*");
+//        response.setHeader("Access-Control-Allow-Methods", "GET, POST");
+
+        // 关闭OSSClient。
+        builder.shutdown();
+        return ApiResult.success(respMap);
+    }
+
+    @ApiOperation(value = "服务端上传(二进制字符串)", notes = "服务端上传")
+    @PostMapping(value = "str/upload")
+    public String strUpload(InputStream inputStream, String filename) throws IOException {
+        //String filename = System.currentTimeMillis() + CodeGenerateUtils.generateVolumeSn()+".jpg";
+        // Endpoint以杭州为例,其它Region请按实际情况填写。
+        final String endpoint = AliOssMange.endpoint;
+        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
+        final String accessKeyId = AliOssMange.accessKeyId;
+        final String accessKeySecret = AliOssMange.accessKeySecret;
+        final String bucketName = AliOssMange.bucketName;
+        // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
+        String objectName = AliOssMange.dir + filename;
+        // 创建OSSClient实例。
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
+        // InputStream inputStream = new FileInputStream("D:\\localpath\\examplefile.txt");
+        // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。Object完整路径中不能包含Bucket名称。
+        PutObjectResult putObjectResult = ossClient.putObject(bucketName, objectName, inputStream);
+        OSSObject ossObject = ossClient.getObject(bucketName, objectName);
+        String uri = ossObject.getResponse().getUri();
+        // 关闭OSSClient。
+        ossClient.shutdown();
+        return uri;
+    }
+
+    /**
+     * oss上传成功回调
+     *
+     * @param callback
+     * @return
+     */
+    @ApiOperation(value = "oss回调", notes = "oss回调")
+    @PostMapping(value = "/callback")
+    public ApiResult callback(@RequestBody Map<String, Object> callback) {
+        String filename = "http://".concat(AliOssMange.bucketName).concat(".").concat(AliOssMange.endpoint).concat("/").concat(callback.get("filename").toString());
+        return ApiResult.okmsg(filename);
+    }
 }
 
diff --git a/manage/src/main/java/com/jilongda/manage/controller/TTicketController.java b/manage/src/main/java/com/jilongda/manage/controller/TTicketController.java
index 8781903..58d47e7 100644
--- a/manage/src/main/java/com/jilongda/manage/controller/TTicketController.java
+++ b/manage/src/main/java/com/jilongda/manage/controller/TTicketController.java
@@ -1,21 +1,20 @@
 package com.jilongda.manage.controller;
 
 
+import com.alibaba.fastjson.JSONObject;
+import com.jilongda.common.Ticket.TicketUtil;
 import com.jilongda.common.basic.ApiResult;
 import com.jilongda.common.basic.PageInfo;
+import com.jilongda.manage.model.TStore;
 import com.jilongda.manage.model.TTicket;
-import com.jilongda.manage.query.TWarehousingDetailQuery;
 import com.jilongda.manage.query.TicketQuery;
+import com.jilongda.manage.service.TStoreService;
 import com.jilongda.manage.service.TTicketService;
-import com.jilongda.manage.vo.TFrameWarehousingDetailVO;
 import com.jilongda.manage.vo.TTicketVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.models.auth.In;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-
-import sun.security.krb5.internal.Ticket;
 
 /**
  * <p>
@@ -31,8 +30,11 @@
 public class TTicketController {
 
 
+
     @Autowired
     private TTicketService tTicketService;
+    @Autowired
+    private TStoreService storeService;
 
     @ApiOperation(value = "小票机列表")
     @PostMapping(value = "/pageList")
@@ -44,6 +46,12 @@
     @ApiOperation(value = "小票机添加")
     @PostMapping(value = "/add")
     public ApiResult<String> add(@RequestBody TTicket dto) {
+        TStore store = storeService.getById(dto.getStoreId());
+        String res = TicketUtil.addprinter(dto.getCloudId() + "#" + dto.getSecret() + "#" + store.getName());
+        JSONObject result = JSONObject.parseObject(res);
+        if (!result.getString("msg").equals("ok")){
+            return ApiResult.failed(result.getString("msg"));
+        }
         tTicketService.save(dto);
         return ApiResult.success();
     }
@@ -55,6 +63,12 @@
     @ApiOperation(value = "小票机编辑")
     @PostMapping(value = "/update")
     public ApiResult<String> update(@RequestBody TTicket dto) {
+        TStore store = storeService.getById(dto.getStoreId());
+        String res = TicketUtil.editprinter(dto.getCloudId()+"",store.getName());
+        JSONObject result = JSONObject.parseObject(res);
+        if (!result.getString("msg").equals("ok")){
+            return ApiResult.failed(result.getString("msg"));
+        }
         tTicketService.updateById(dto);
         return ApiResult.success();
     }
diff --git a/optometrist/pom.xml b/optometrist/pom.xml
index 0f7f05e..a015838 100644
--- a/optometrist/pom.xml
+++ b/optometrist/pom.xml
@@ -17,6 +17,33 @@
     </properties>
 
     <dependencies>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-test</artifactId>
diff --git a/optometrist/src/main/java/com/jilongda/optometrist/controller/TOptometristController.java b/optometrist/src/main/java/com/jilongda/optometrist/controller/TOptometristController.java
index 92d624e..48787e6 100644
--- a/optometrist/src/main/java/com/jilongda/optometrist/controller/TOptometristController.java
+++ b/optometrist/src/main/java/com/jilongda/optometrist/controller/TOptometristController.java
@@ -1,20 +1,19 @@
 package com.jilongda.optometrist.controller;
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.jilongda.common.Ticket.TAddOptometryVO;
+import com.jilongda.common.Ticket.TOptometryDetailVO;
+import com.jilongda.common.Ticket.TicketUtil;
 import com.jilongda.common.basic.ApiResult;
 import com.jilongda.common.basic.PageInfo;
-import com.jilongda.optometrist.authority.model.SecUser;
 import com.jilongda.optometrist.authority.service.SecUserService;
 import com.jilongda.optometrist.model.*;
-import com.jilongda.optometrist.query.TOptometristQuery;
 import com.jilongda.optometrist.query.TOptometryQuery;
-import com.jilongda.optometrist.query.TicketQuery;
 import com.jilongda.optometrist.service.*;
 import com.jilongda.optometrist.utils.LoginInfoUtil;
 import com.jilongda.optometrist.vo.*;
-import com.sun.org.apache.bcel.internal.generic.NEW;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.BeanUtils;
@@ -22,6 +21,7 @@
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
+import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Date;
@@ -57,6 +57,8 @@
     private TOrderService orderService;
     @Autowired
     private TOptometryDetailService optometryDetailService;
+    @Autowired
+    private TTicketService tTicketService;
     @ApiOperation(value = "获取验光单分页列表",tags = "验光单")
     @PostMapping(value = "/pageList")
     public ApiResult<PageInfo<TOptometryVO>> pageList(@RequestBody TOptometryQuery query) {
@@ -267,6 +269,25 @@
         // 验光完成
         lineUp.setStatus(3);
         tLineUpService.updateById(lineUp);
+        dto.setOptometristName(optometrist.getName());
+        TStore store = storeService.getById(lineUp.getStoreId());
+        dto.setShopName(store.getName());
+        TAppUser appUser = appUserService.getById(lineUp.getUserId());
+        dto.setPhone(appUser.getPhone());
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String format = simpleDateFormat.format(new Date());
+        dto.setTime(format);
+        TTicket tTicket = tTicketService.lambdaQuery().eq(TTicket::getStoreId, lineUp.getStoreId())
+                .eq(TTicket::getStatus, 1).list().stream().findFirst().orElse(null);
+        if (tTicket==null){
+            return ApiResult.failed("当前门店未绑定小票机");
+        }
+        dto.setSn(tTicket.getCloudId()+"");
+        String print = TicketUtil.print(dto);
+        JSONObject jsonObject = JSONObject.parseObject(print);
+        if (!jsonObject.getString("msg").equals("0")){
+            return ApiResult.failed(jsonObject.getString("msg"));
+        }
         return ApiResult.success();
     }
 
diff --git a/optometrist/src/main/java/com/jilongda/optometrist/vo/TAddOptometryVO.java b/optometrist/src/main/java/com/jilongda/optometrist/vo/TAddOptometryVO.java
deleted file mode 100644
index d83aa93..0000000
--- a/optometrist/src/main/java/com/jilongda/optometrist/vo/TAddOptometryVO.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.jilongda.optometrist.vo;
-
-import com.baomidou.mybatisplus.annotation.TableField;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-@ApiModel(value = "添加验光单VO")
-public class TAddOptometryVO {
-
-    @ApiModelProperty(value = "预约id")
-    private Integer id;
-    @ApiModelProperty(value = "验光单详情")
-    private List<TOptometryDetailVO> optometryDetailVOS;
-}

--
Gitblit v1.7.1