fs-danaus
2023-12-21 e2c4f0115ec02483733545ff82a0b955acd55ac4
提交 | 用户 | age
a6a76f 1 package com.yc.open.controller;
F 2
31400f 3 import com.alibaba.fastjson.JSON;
a6a76f 4 import com.yc.action.BaseAction;
0a03f9 5 import com.yc.action.build.FormidVersion;
31400f 6 import com.yc.api.utils.SQLUtils;
F 7 import com.yc.exception.CallBackMessage;
a6a76f 8 import com.yc.factory.FactoryBean;
2b4227 9 import com.yc.multiData.MultiDataSource;
31400f 10 import com.yc.multiData.SpObserver;
a6a76f 11 import com.yc.open.utils.ApiUtils;
F 12 import com.yc.open.utils.CallBackMessageToObject;
b0744c 13 import com.yc.sdk.WebSocketMessage.action.WebSocketMessageServer;
31400f 14 import com.yc.service.BaseService;
F 15 import com.yc.utils.SessionKey;
16 import net.coobird.thumbnailator.Thumbnails;
e2c4f0 17 import org.springframework.beans.factory.annotation.Autowired;
31400f 18 import org.springframework.dao.DataAccessException;
e2c4f0 19 import org.springframework.data.redis.core.RedisTemplate;
31400f 20 import org.springframework.jdbc.LobRetrievalFailureException;
F 21 import org.springframework.jdbc.core.support.AbstractLobStreamingResultSetExtractor;
e2c4f0 22 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
0a03f9 23 import org.springframework.web.bind.annotation.RequestMapping;
F 24 import org.springframework.web.bind.annotation.RequestMethod;
25 import org.springframework.web.bind.annotation.ResponseBody;
26 import org.springframework.web.bind.annotation.RestController;
a6a76f 27
31400f 28 import javax.imageio.ImageIO;
a6a76f 29 import javax.servlet.http.HttpServletRequest;
31400f 30 import java.awt.image.BufferedImage;
F 31 import java.io.ByteArrayInputStream;
32 import java.io.ByteArrayOutputStream;
33 import java.io.IOException;
34 import java.sql.ResultSet;
35 import java.sql.SQLException;
36 import java.util.*;
e2c4f0 37 import java.util.concurrent.TimeUnit;
a6a76f 38
F 39 /**
40  * 测试用例
41  */
42 @RestController
43 public class EchoController extends BaseAction {
e2c4f0 44     @Autowired
F 45     ThreadPoolTaskExecutor threadPoolExecutor;
a6a76f 46     @RequestMapping(value = "/open/echoget.do",method = RequestMethod.GET)
F 47     public @ResponseBody Object echo(HttpServletRequest request){
48         //验证已在filter里面做,这里只需要处理业务逻辑
49         CallBackMessageToObject callBackMessage=new CallBackMessageToObject();
50         return callBackMessage.sendSuccessMessage(request.getParameter("echo"));
51     }
52     @RequestMapping(value = "/open/echopost.do",method = RequestMethod.POST)
53     public @ResponseBody Object echoPost(HttpServletRequest request){
54         //验证已在filter里面做,这里只需要处理业务逻辑
55         CallBackMessageToObject callBackMessage=new CallBackMessageToObject();
56         try {
57             Map map = (Map) request.getAttribute(ApiUtils.MAP_OBJECT);
58             if(map==null){
fe2b91 59                 return callBackMessage.sendSuccessMessage(request.getParameter("data"));
a6a76f 60             }else {
1f813e 61                 return callBackMessage.setData(request.getParameter("data")).sendSuccessMessage("成功");
a6a76f 62             }
F 63         }catch (Exception e){
64             return callBackMessage.sendErrorMessage(e.getMessage());
65         }
66
67     }
68     /**
69      * 模拟提交到第三方系统
70      * @param request
71      * @return
72      */
1f813e 73     @RequestMapping(value = "/test.do")
a6a76f 74     public @ResponseBody void testCall(HttpServletRequest request){
1f813e 75
a6a76f 76         try {
1f813e 77            // TokenUtils.getToken();
a6a76f 78         } catch (Exception e) {
F 79             e.printStackTrace();
80         }
81     }
82     /**
83      * 模拟提交到第三方系统
84      * @param request
85      * @return
86      */
87     @RequestMapping(value = "/open/postData.do",method = RequestMethod.POST)
88     public @ResponseBody Object dataPost(HttpServletRequest request){
89         //验证已在filter里面做,这里只需要处理业务逻辑
90         CallBackMessageToObject callBackMessage=new CallBackMessageToObject();
91         try {
92             Map map = (Map) request.getAttribute(ApiUtils.MAP_OBJECT);
93             Random random=new Random();
94             boolean flg=false;//random.nextBoolean();
95             if(flg) {
96                 if (map == null) {
97                     return callBackMessage.setData("http://www.163.com").sendSuccessMessage("成功");
98                 } else {
99                     return callBackMessage.setData("http://www.163.com").sendSuccessMessage("成功");
100                 }
101             }else{
102                 throw  new  Exception("更新出错");
103             }
104         }catch (Exception e){
105             return callBackMessage.sendErrorMessage(e.getMessage());
106         }
107
108     }
0a03f9 109
F 110     /**
111      * 查看内存里对应数据源的版本号信息
112      * @param dbid
113      * @param request
114      * @return
115      */
116     @RequestMapping(value = "/version/getv.do",method = RequestMethod.GET)
117     public @ResponseBody Object getVersion(String dbid,String formid,HttpServletRequest request){
118         FormidVersion formidVersion=(FormidVersion)FactoryBean.getBean("FormidVersion");
119         CallBackMessageToObject callBackMessage=new CallBackMessageToObject();
120        return   callBackMessage.setData(formidVersion.getFormVersion(dbid,formid)).sendSuccessMessage("ID:"+formidVersion);
121     }
2b4227 122     /**
F 123      * 查看内存里数据源信息
124      * @return
125      */
126     @RequestMapping(value = "/db/dbInfo.do",method = RequestMethod.GET)
127     public @ResponseBody Object getdbInfo(){
128         CallBackMessageToObject callBackMessage=new CallBackMessageToObject();
129         final List<String> id=new ArrayList<>();
130         MultiDataSource.getcomm().forEach((key,value)->{
131             id.add(key);
132         });
133         return   callBackMessage.sendSuccessMessage(this+"=>"+id);
134     }
b0744c 135     /**
F 136      * 查看内存里webSocket用户信息
137      * @return
138      */
139     @RequestMapping(value = "/db/wsInfo.do",method = RequestMethod.GET)
140     public @ResponseBody Object wsInfo(){
141         CallBackMessageToObject callBackMessage=new CallBackMessageToObject();
142         final List<String> id=new ArrayList<>();
143         WebSocketMessageServer.getOnlineUserList().forEach((key, value)->{
144             id.add(key);
145         });
146         return   callBackMessage.sendSuccessMessage(this+"=>"+id);
147     }
31400f 148     /**
F 149      * 重新把附件表的缩略图更新一次,因为有很多缩略图旧数据是有问题
150      * @return
151      */
e2c4f0 152     @RequestMapping(value = "/attachment/refreshAttachments.do")
31400f 153     public @ResponseBody Object refreshAttachmentFromOriginalPictureToSmallPicture(HttpServletRequest request){
F 154         CallBackMessage callBackMessage = new CallBackMessage();
e2c4f0 155         //---避免重复执行,每次执行前从redis中取数判断是否已执行过
F 156         RedisTemplate redisTemplate= (RedisTemplate) FactoryBean.getBean("redisTemplate");
157         Object dbid=request.getSession().getAttribute(SessionKey.DATA_BASE_ID);
158         String key="refreshAttachmentDbIdKey:"+dbid;
159         Object value = redisTemplate.opsForValue().get(key);
160         if(value!=null){
161             //有值则跳过不执行
162            // callBackMessage.setData();
163             callBackMessage.sendErrorMessage("已执行过,无需重复执行");
31400f 164             return callBackMessage.toJSONObject();
e2c4f0 165         }else {
F 166             redisTemplate.opsForValue().set(key,1,8, TimeUnit.HOURS);//8小时过期
31400f 167         }
e2c4f0 168         threadPoolExecutor.execute(()->{
F 169             try {
170                 SpObserver.setDBtoInstance("_" +dbid);
171                 BaseService baseService = (BaseService) FactoryBean.getBean("BaseService");
172                 Map result= new HashMap();
173                 long start=System.currentTimeMillis();
174                 List<Map<String, Object>> list = baseService.getSimpleJdbcTemplate().queryForList("select unid,seq from _sys_Attachment9 where filetype in('jpg','png','JPG','PNG') \n" +
175                         "union \n" +
176                         "select unid,seq from _sys_Attachment where filetype in('jpg','png','JPG','PNG')\n");
177                 if(list!=null&&list.size()>0) {
178                     List<List<Map<String, Object>>> lists = SQLUtils.splitList(list, 50);//分页处理,一次处理20条
179                     lists.stream().forEach(subList->{
180                         final StringBuilder sql=new StringBuilder("");
181                         subList.stream().forEach(x -> {
182                             String unid = x.get("unid") + "";
183                             String seq = x.get("seq") + "";
184                             baseService.getJdbcTemplate().query(" declare @unid varchar(100)='" + unid + "',@seq int=" + seq +
185                                     " \n declare @table table(fileType varchar(10),OriginalPicture image,ctype varchar(10))\n" +
186                                     " insert into @table select filetype,OriginalPicture,'9' as ctype from _sys_Attachment9\n" +
187                                     " where unid=@unid and seq=@seq\n" +
188                                     " if @@ROWCOUNT=0 \n" +
189                                     "  insert into @table select filetype,OriginalPicture,'' as ctype from _sys_Attachment\n" +
190                                     "  where unid=@unid and seq=@seq\n" +
191                                     "select * from @table", new AbstractLobStreamingResultSetExtractor() {
192                                 @Override
193                                 protected void handleNoRowFound() throws LobRetrievalFailureException {
194                                     System.out.println(unid + ";" + seq + "-没数据");
195                                 }
196                                 @Override
197                                 protected void streamData(ResultSet resultSet) throws SQLException, IOException, DataAccessException {
198                                     ByteArrayOutputStream outputStream = null;
199                                     ByteArrayInputStream bais =null;
200                                     try {
201                                         do {
202                                             byte[] byteData = resultSet.getBytes("OriginalPicture");//原图
203                                             String fileType = resultSet.getString("filetype");//图片类型
204                                             String type=resultSet.getString("ctype");//9还是19类型
205                                             bais = new ByteArrayInputStream(byteData);
206                                             BufferedImage image = ImageIO.read(bais);
207                                             outputStream = new ByteArrayOutputStream();
208                                             Thumbnails.of(image).scale(0.25).outputQuality(1).outputFormat(fileType).toOutputStream(outputStream);
209                                             byte[] outData = outputStream.toByteArray();
210                                             // 将二进制数据转换为十六进制字符串
211                                             StringBuilder hexString = new StringBuilder();
212                                             for (byte b : outData) {
213                                                 hexString.append(String.format("%02x", b));
214                                             }
215
216                                             sql.append("\n update a set SmallPicture =0x"+hexString.toString()+" from _sys_Attachment"+type+" a where unid='" + unid + "' and seq=" + seq);
217                                         } while (resultSet.next());
218                                     } catch (Exception e) {
219                                         e.printStackTrace();
220                                     }finally {
221                                         if(outputStream!=null) outputStream.close();
222                                         if(bais!=null) bais.close();
223                                     }
224                                 }
225                             });
226                         });
227                             baseService.getJdbcTemplate().update(sql.toString());
228                             log.warn("批量更新50条成功");
229                     });
230                 }
231                 redisTemplate.delete(key);
232                 long end=System.currentTimeMillis();
233                 result.put("time",(end-start)/(3600000));
234                 result.put("count",list==null?0:list.size());
235                 log.warn(JSON.toJSONString(result));
236                 callBackMessage.setInfo(result).sendSuccessMessageByDefault();
237                 log.warn(callBackMessage.toJSONObject().toString());
238             } catch (Exception e) {
239                 callBackMessage.sendErrorMessage(e.getMessage());
240                 log.warn(callBackMessage.toJSONObject().toString());
241             } finally {
242                 SpObserver.setDBtoInstance();
243             }
244         });
245         callBackMessage.setData("成功");
246         callBackMessage.setMemo("执行中...重建缩略图需要时间,视附件数量约需时5~8小时").sendSuccessMessageByDefault();
247         return callBackMessage.toJSONObject();
31400f 248     }
F 249
a6a76f 250 }