sync2.prod.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. using SiteCore.helper;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Text;
  6. namespace SiteCore.Handler
  7. {
  8. public partial class sync2
  9. {
  10. double comLng = 117.07548;
  11. double comLat = 25.135471;
  12. //117.07548|25.135471"
  13. public void get_prod()
  14. {
  15. string sql = "select con,uptime from c_json";
  16. DataTable dt = ErpSqlHelper.ExecuteDataSet(sql).Tables[0];
  17. string str = "";
  18. string dtime = "";
  19. if (dt != null && dt.Rows.Count > 0)
  20. {
  21. DataRow dr = dt.Rows[0];
  22. str = dr["con"].ToString();
  23. str = str.ToString().Replace("§", "'");//№※
  24. dtime = Convert.ToDateTime(dr["uptime"]).ToString("yy-MM-dd HH:mm:ss");
  25. }
  26. else
  27. {
  28. //dtime = DateTime.Now.ToString("yy-MM-dd HH:mm:ss");
  29. }
  30. con.Response.Write("{\"type\":\"success\",\"result\":[" + str.ToString() + "],\"date\":\"" + dtime + "\"}");
  31. //returnSuccess("["+str.ToString()+"]");
  32. }
  33. public void get_fastprod()
  34. {
  35. //DataStruct dStruct = GetStruct();
  36. //dStruct.MainWhere = "p1userid=" + CurrentUser.UserID + " and state=0 and isdel=0";
  37. //dStruct.Order = "createtime desc";
  38. //DataTable dt = WebCache.GetData("c_user", dStruct);
  39. StringBuilder sql = new StringBuilder();
  40. sql.Append("select sitename,project,cgrade,0.0 as total,0.0 as deli,0.0 as volume,0.0 as truckcount from c_prod group by sitename,project,cgrade ;");//where truckcode='32'
  41. //Total,Deli,volume,TruckCount,
  42. sql.Append("select a.autoid,a.sitename,a.project,a.cgrade,a.truckcode,a.total,a.deli,a.volume,a.truckcount, '' as lat,'' as lng,'' as flag,0.0 as rp,b.isarrive,b.arrivetime,b.isback,b.backtime,a.pdate,a.completetime from c_prod as a left join c_prodstate as b on a.autoid=b.prodid ;");//where a.truckcode='018'
  43. sql.Append("select * from c_cargps where id in(select max(id) from c_cargps where replace(platenum,'号','') in (select truckcode from c_prod) group by platenum) ;");
  44. sql.Append("select * from c_cust where sitename in (select sitename from c_prod group by sitename) ;");
  45. //sql.Append("select * from c_prodstate where prodid in (select autoid from c_prod) ;");
  46. DataSet ds = ErpSqlHelper.ExecuteDataSet(sql.ToString());
  47. DataTable pgDt = ds.Tables[0];
  48. DataTable prodDt = ds.Tables[1];
  49. DataTable gpsDt = ds.Tables[2];
  50. DataView gpsDv = new DataView(gpsDt);
  51. DataTable custDt = ds.Tables[3];
  52. DataView custDv = new DataView(custDt);
  53. //DataView psDv = new DataView(ds.Tables[4]);
  54. foreach (DataRow dr in prodDt.Rows)
  55. {
  56. gpsDv.RowFilter = "PlateNum='" + dr["truckcode"] + "号'";
  57. if (gpsDv.Count > 0)
  58. {
  59. dr["lat"] = gpsDv[0]["Latitude"];
  60. dr["lng"] = gpsDv[0]["Longitude"];
  61. dr["flag"] = gpsDv[0]["StateFlag"];
  62. //dr["GpsTime"]= gpsDv[0]["GpsTime"];
  63. }
  64. }
  65. DataView prodDv = new DataView(prodDt);
  66. StringBuilder str = new StringBuilder();
  67. StringBuilder prodStr = new StringBuilder();
  68. int k = 0;
  69. int y = 0;
  70. double sitemileage = 0;
  71. string siteaddress = "";
  72. string sitelnglat = "";
  73. string cid = "";
  74. double enLng = 0;
  75. double enLat = 0;
  76. double dist = 0;
  77. double dist2 = 0;
  78. int p = 0;
  79. List<string> finLst = new List<string>();
  80. //bool is
  81. StringBuilder pgSql = new StringBuilder();
  82. foreach (DataRow dr in pgDt.Rows)
  83. {
  84. custDv.RowFilter = "sitename='" + dr["sitename"] + "'";
  85. if (custDv.Count > 0)
  86. {
  87. DataRowView cdrv = custDv[0];
  88. sitemileage = Convert.ToDouble(cdrv["sitemileage"]);
  89. siteaddress = cdrv["siteaddress"].ToString();
  90. sitelnglat = cdrv["lng"] + "|" + cdrv["lat"];
  91. cid = cdrv["id"].ToString();
  92. if (cdrv["lng"].ToString() != "" && cdrv["lat"].ToString() != "")
  93. {
  94. enLng = Convert.ToDouble(cdrv["lng"]);
  95. enLat = Convert.ToDouble(cdrv["lat"]);
  96. }
  97. }
  98. prodStr = new StringBuilder();
  99. //if(dr["sitename"].ToString()== "东新水沟(马头宫庙-龙津河)黑臭水体改造工程")
  100. //{
  101. // int c = 0;
  102. //}
  103. prodDv.RowFilter = "sitename='" + dr["sitename"] + "' and project='" + dr["project"] + "' and cgrade='" + dr["cgrade"] + "'";
  104. prodDv.Sort = "pdate desc";
  105. if (prodDv.Count > 0)
  106. {
  107. //0.0 as deli,0.0 as volume,0.0 as truckcount
  108. //这里把最新的方量信息填入
  109. dr["total"] = prodDv[0]["total"];
  110. dr["deli"] = prodDv[0]["deli"];
  111. dr["volume"] = prodDv[0]["volume"];
  112. dr["truckcount"] = prodDv[0]["truckcount"];
  113. }
  114. y = 0;
  115. bool isArrive = false;
  116. bool isBack = false;
  117. object arrivetime = "";
  118. object backtime = "";
  119. foreach (DataRowView drv in prodDv)
  120. {
  121. if (drv["truckcode"].ToString() == "") continue;
  122. if (drv["isback"] != DBNull.Value && Convert.ToInt32(drv["isback"]) == 1)
  123. {
  124. if (backtime.ToString() == "" || (backtime.ToString() != "" && DateTime.Now.Subtract(Convert.ToDateTime(backtime)).TotalMinutes >= 5))
  125. {
  126. continue;
  127. }
  128. }
  129. arrivetime = "";
  130. backtime = "";
  131. isBack = false;
  132. if (Convert.ToDateTime(drv["completetime"]).ToString("yyyy") == "1900")
  133. {
  134. isArrive = false;
  135. }
  136. else
  137. {
  138. if (drv["isArrive"] == DBNull.Value || Convert.ToInt32(drv["isArrive"]) == 0)//未到达
  139. {
  140. isArrive = checkIsArrive(Convert.ToDateTime(drv["completetime"]).ToString("yyyy-MM-dd HH:mm:ss"), enLng, enLat, drv["autoid"], drv["truckcode"], out arrivetime);
  141. }
  142. else
  143. {
  144. arrivetime = drv["arrivetime"];
  145. isArrive = true;
  146. }
  147. }
  148. //如果回厂了
  149. if (isArrive)
  150. {
  151. isBack = checkIsBack(Convert.ToDateTime(arrivetime).ToString("yyyy-MM-dd HH:mm:ss"), comLng, comLat, drv["autoid"], drv["truckcode"], out backtime);
  152. }
  153. if (isBack)
  154. {
  155. if (backtime.ToString() == "" || (backtime.ToString() != "" && DateTime.Now.Subtract(Convert.ToDateTime(backtime)).TotalMinutes >= 5))
  156. {
  157. continue;
  158. }
  159. }
  160. //if(drv["truckcode"].ToString()=="21")
  161. //{
  162. // int c = 1;
  163. //}
  164. if (y > 0) prodStr.Append(",");
  165. p = 0;
  166. if (sitemileage > 0 && drv["lat"].ToString() != "" && drv["lng"].ToString() != "")
  167. {
  168. //if (psDv.Count >0 && Convert.ToInt32(drv["isBack"])==1)
  169. //{
  170. // continue;
  171. //}
  172. //如果发车时间小于等于25分钟,则出厂
  173. //如果前10次经纬度的值,是回来的,则是回厂
  174. if (!isArrive)//
  175. {
  176. dist = GetDistance(comLat, comLng, Convert.ToDouble(drv["lat"]), Convert.ToDouble(drv["lng"]));
  177. //dist2 = GetDistance(enLat, enLng, Convert.ToDouble(drv["lat"]), Convert.ToDouble(drv["lng"]));
  178. p = Convert.ToInt32((dist / (sitemileage * 1000.0)) * 10);
  179. if ((dist - sitemileage * 1000.0) >= -500) //5-5.0>=-500
  180. {
  181. pgSql.AppendFormat("if (select count(0) from c_prodstate where prodid={0})>0 begin ", drv["autoid"]);
  182. pgSql.AppendFormat("update c_prodstate set isarrive=1, arrivetime=getdate() where isarrive=0 and prodid={0} ", drv["autoid"]);
  183. pgSql.Append(" end else begin ");
  184. pgSql.AppendFormat("insert into c_prodstate(prodid,isarrive,arrivetime)values({0},{1},getdate()) ", drv["autoid"], 1);
  185. pgSql.Append(" end ");
  186. }
  187. //prodStr.Append("{").AppendFormat("\"cnum\":\"{0}\",\"pg\":\"{1}\",\"to\":\"1\"", drv["truckcode"], p).Append("}");
  188. prodStr.Append("{").AppendFormat("\"cnum\":\"{0}\",\"pg\":\"{1}\",\"to\":\"1\",\"tcount\":\"{2}\",\"volume\":\"{3}\"",
  189. drv["truckcode"], p, drv["truckcount"], drv["volume"]).Append("}");
  190. y++;
  191. }
  192. else if (enLat > 0 && isArrive)//
  193. {
  194. dist = GetDistance(enLat, enLng, Convert.ToDouble(drv["lat"]), Convert.ToDouble(drv["lng"]));
  195. p = Convert.ToInt32((dist / (sitemileage * 1000.0)) * 10);
  196. if ((dist - sitemileage * 1000.0) >= -500) //5-5.0>=-500
  197. {
  198. pgSql.AppendFormat("update c_prodstate set isback=1,backtime=getdate() where isarrive=1 and prodid={0} ;", drv["autoid"]);
  199. }
  200. prodStr.Append("{").AppendFormat("\"cnum\":\"{0}\",\"pg\":\"{1}\",\"to\":\"0\",\"tcount\":\"{2}\",\"volume\":\"{3}\"",
  201. drv["truckcode"], p, drv["truckcount"], drv["volume"]).Append("}");
  202. y++;
  203. }
  204. }
  205. else
  206. {
  207. if (DateTime.Now.Subtract(Convert.ToDateTime(drv["completetime"])).TotalHours < 6)
  208. {
  209. //prodStr.Append("{").AppendFormat("\"cnum\":\"{0}\",\"pg\":\"-1\",\"to\":\"1\"", drv["truckcode"]).Append("}");
  210. prodStr.Append("{").AppendFormat("\"cnum\":\"{0}\",\"pg\":\"-1\",\"to\":\"0\",\"tcount\":\"{1}\",\"volume\":\"{2}\"",
  211. drv["truckcode"], p, drv["truckcount"], drv["volume"]).Append("}");
  212. y++;
  213. }
  214. }
  215. //y++;
  216. }
  217. if (pgSql.Length > 0)
  218. {
  219. ErpSqlHelper.ExecuteNonQuery(pgSql.ToString());
  220. }
  221. if (prodStr.Length > 0)
  222. {
  223. if (k > 0) str.Append(",");
  224. str.Append("{").AppendFormat("\"sitename\":\"{0}\",\"project\":\"{1}\",\"cgrade\":\"{2}\",\"sitemileage\":\"{3}\",\"address\":\"{4}\",\"lnglat\":\"{5}\",\"id\":\"{6}\",\"data\":{7},\"total\":\"{8}\",\"deli\":\"{9}\",\"truckcount\":\"{10}\"",
  225. dr["sitename"], dr["project"], dr["cgrade"], sitemileage, siteaddress, sitelnglat, cid, "[" + prodStr.ToString().TrimEnd(',') + "]", dr["total"], dr["deli"], dr["truckcount"]).Append("}");
  226. k++;
  227. }
  228. }
  229. con.Response.Write("{\"type\":\"success\",\"result\":[" + str.ToString() + "],\"date\":\"" + DateTime.Now.ToString("yy-MM-dd HH:mm:ss") + "\"}");
  230. // returnSuccess("[" + str.ToString() + "]");
  231. //con.Response.Write();
  232. //writeGridDataTableJson(dt.Rows.Count, dt);
  233. }
  234. public bool checkIsArrive(string sdate, double enlng, double enlat, object autoid, object cnum, out object gpstime)
  235. {
  236. gpstime = "";
  237. string sql = string.Format("select * from c_cargps where platenum='{1}' and datediff(minute,'{0}',gpstime)>=25", sdate, cnum + "号");
  238. DataTable dt = ErpSqlHelper.ExecuteDataSet(sql).Tables[0];
  239. double dist = 0;
  240. StringBuilder pgSql = new StringBuilder();
  241. foreach (DataRow dr in dt.Rows)
  242. {
  243. dist = GetDistance(enlat, enlng, Convert.ToDouble(dr["latitude"]), Convert.ToDouble(dr["longitude"]));
  244. if (Math.Abs(dist) <= 800)
  245. {
  246. gpstime = dr["gpstime"];
  247. pgSql.AppendFormat("insert into c_prodstate(prodid,isarrive,arrivetime)values({0},{1},'{2}') ;", autoid, 1, dr["gpstime"]);
  248. ErpSqlHelper.ExecuteNonQuery(pgSql.ToString());
  249. return true;
  250. //break;
  251. }
  252. }
  253. return false;
  254. }
  255. public bool checkIsBack(string sdate, double lng, double lat, object autoid, object cnum, out object gpstime)
  256. {
  257. gpstime = "";
  258. string sql = string.Format("select * from c_cargps where platenum='{1}' and datediff(minute,'{0}',gpstime)>=10", sdate, cnum + "号");
  259. DataTable dt = ErpSqlHelper.ExecuteDataSet(sql).Tables[0];
  260. double dist = 0;
  261. StringBuilder pgSql = new StringBuilder();
  262. foreach (DataRow dr in dt.Rows)
  263. {
  264. dist = GetDistance(lat, lng, Convert.ToDouble(dr["latitude"]), Convert.ToDouble(dr["longitude"]));
  265. if (Math.Abs(dist) <= 800)
  266. {
  267. gpstime = dr["gpstime"];
  268. pgSql.AppendFormat("update c_prodstate set isback=1,backtime='{1}' where isarrive=1 and prodid={0} ;", autoid, dr["gpstime"]);
  269. ErpSqlHelper.ExecuteNonQuery(pgSql.ToString());
  270. return true;
  271. //break;
  272. }
  273. }
  274. return false;
  275. }
  276. public void get_cust()
  277. {
  278. DataStruct dStruct = GetPostStruct();
  279. List<string> lw = new List<string>();
  280. string key = GetPostString("key");
  281. if (key.Length > 0) lw.Add(string.Format("(customername like '%{0}%' or sitename like '%{0}%')", key));
  282. dStruct.Order = "siteid desc";
  283. dStruct.MainWhere = string.Join(" and ", lw.ToArray());
  284. DataTable dt = WebCache.GetErpData("c_cust", dStruct);
  285. writeGridDataTableJson(dStruct.TotalCount, dt);
  286. }
  287. public void save_siteposition()
  288. {
  289. if (UrlPostParmsCheck("cid,lnglat,tenlnglat"))
  290. {
  291. int cid = GetPostInt("cid");
  292. string lnglat = GetPostString("lnglat");
  293. string[] lArr = lnglat.Split(',');
  294. string tenlnglat = GetPostString("tenlnglat");
  295. string[] tlArr = tenlnglat.Split(',');
  296. double[] llArr = GpsUtil.Gcj02ToBd09(Convert.ToDouble(tlArr[1]), Convert.ToDouble(tlArr[0]));
  297. string address = GetPostString("address");
  298. string mileage = GetPostString("mileage");
  299. string sql = string.Format("update c_cust set lng='{0}',lat='{1}',tenlng='{2}',tenlat='{3}',siteaddress='{4}',sitemileage={5} where id={6}",
  300. llArr[1], llArr[0], tlArr[0], tlArr[1], address, mileage, cid);
  301. ErpSqlHelper.ExecuteNonQuery(sql);
  302. returnSuccessMsg("保存成功!");
  303. }
  304. }
  305. #region 距离
  306. //地球半径,单位米
  307. private const double EARTH_RADIUS = 6378137;
  308. /// <summary>
  309. /// 计算两点位置的距离,返回两点的距离,单位 米
  310. /// 该公式为GOOGLE提供,误差小于0.2米
  311. /// </summary>
  312. /// <param name="lat1">第一点纬度</param>
  313. /// <param name="lng1">第一点经度</param>
  314. /// <param name="lat2">第二点纬度</param>
  315. /// <param name="lng2">第二点经度</param>
  316. /// <returns></returns>
  317. public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
  318. {
  319. double radLat1 = Rad(lat1);
  320. double radLng1 = Rad(lng1);
  321. double radLat2 = Rad(lat2);
  322. double radLng2 = Rad(lng2);
  323. double a = radLat1 - radLat2;
  324. double b = radLng1 - radLng2;
  325. double result = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) + Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2))) * EARTH_RADIUS;
  326. return result;
  327. }
  328. /// <summary>
  329. /// 经纬度转化成弧度
  330. /// </summary>
  331. /// <param name="d"></param>
  332. /// <returns></returns>
  333. private static double Rad(double d)
  334. {
  335. return (double)d * Math.PI / 180d;
  336. }
  337. #endregion
  338. }
  339. }