app.huarun.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace SiteCore.Handler
  8. {
  9. public partial class app
  10. {
  11. double comLng = 117.075137;
  12. double comLat = 25.135572;
  13. public void get_prod()
  14. {
  15. //DataStruct dStruct = GetStruct();
  16. //dStruct.MainWhere = "p1userid=" + CurrentUser.UserID + " and state=0 and isdel=0";
  17. //dStruct.Order = "createtime desc";
  18. //DataTable dt = WebCache.GetData("c_user", dStruct);
  19. StringBuilder sql = new StringBuilder();
  20. sql.Append("select sitename,project,cgrade from c_prod group by sitename,project,cgrade ;");
  21. sql.Append("select autoid,sitename,project,cgrade,truckcode,'' as lat,'' as lng,'' as flag,0.0 as rp,(select isback from c_prodstate where prodid=c_prod.autoid ) as isback from c_prod;");
  22. 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) ;");
  23. sql.Append("select * from c_cust where sitename in (select sitename from c_prod group by sitename) ;");
  24. sql.Append("select * from c_prodstate where prodid in (select autoid from c_prod) ;");
  25. DataSet ds = ErpSqlHelper.ExecuteDataSet(sql.ToString());
  26. DataTable pgDt = ds.Tables[0];
  27. DataTable prodDt = ds.Tables[1];
  28. DataTable gpsDt = ds.Tables[2];
  29. DataView gpsDv = new DataView(gpsDt);
  30. DataTable custDt = ds.Tables[3];
  31. DataView custDv = new DataView(custDt);
  32. DataView psDv = new DataView(ds.Tables[4]);
  33. foreach (DataRow dr in prodDt.Rows)
  34. {
  35. gpsDv.RowFilter = "PlateNum='" + dr["truckcode"] + "号'";
  36. if (gpsDv.Count > 0)
  37. {
  38. dr["lat"] = gpsDv[0]["Latitude"];
  39. dr["lng"] = gpsDv[0]["Longitude"];
  40. dr["flag"] = gpsDv[0]["StateFlag"];
  41. //dr["GpsTime"]= gpsDv[0]["GpsTime"];
  42. }
  43. }
  44. DataView prodDv = new DataView(prodDt);
  45. StringBuilder str = new StringBuilder();
  46. StringBuilder prodStr = new StringBuilder();
  47. int k = 0;
  48. int y = 0;
  49. double sitemileage = 0;
  50. double enLng = 0;
  51. double enLat = 0;
  52. double dist = 0;
  53. int p = 0;
  54. //bool is
  55. StringBuilder pgSql = new StringBuilder();
  56. foreach (DataRow dr in pgDt.Rows)
  57. {
  58. custDv.RowFilter = "sitename='" + dr["sitename"] + "'";
  59. if (custDv.Count > 0)
  60. {
  61. DataRowView cdrv = custDv[0];
  62. sitemileage = Convert.ToDouble(cdrv["sitemileage"]);
  63. if (cdrv["lng"].ToString() != "" && cdrv["lat"].ToString() != "")
  64. {
  65. enLng = Convert.ToDouble(cdrv["lng"]);
  66. enLat = Convert.ToDouble(cdrv["lat"]);
  67. }
  68. }
  69. prodStr = new StringBuilder();
  70. prodDv.RowFilter = "sitename='" + dr["sitename"] + "' and project='" + dr["project"] + "' and cgrade='" + dr["cgrade"] + "'";
  71. y = 0;
  72. foreach (DataRowView drv in prodDv)
  73. {
  74. if (drv["truckcode"].ToString() == "") continue;
  75. if (drv["isback"] != DBNull.Value && Convert.ToInt32(drv["isback"]) == 1) continue;
  76. //if(drv["truckcode"].ToString()=="21")
  77. //{
  78. // int c = 1;
  79. //}
  80. if (y > 0) prodStr.Append(",");
  81. p = 0;
  82. if (sitemileage > 0 && drv["lat"].ToString() != "" && drv["lng"].ToString() != "")
  83. {
  84. //psDv.RowFilter = "prodid=" + drv["autoid"];
  85. //if (psDv.Count >0 && Convert.ToInt32(drv["isBack"])==1)
  86. //{
  87. // continue;
  88. //}
  89. if (psDv.Count < 1 || Convert.ToInt32(drv["isArrive"]) == 0)
  90. {
  91. dist = GetDistance(comLat, comLng, Convert.ToDouble(drv["lat"]), Convert.ToDouble(drv["lng"]));
  92. p = Convert.ToInt32((dist / (sitemileage * 1000.0)) * 10);
  93. if ((dist - sitemileage * 1000.0) >= -500) //5-5.0>=-500
  94. {
  95. if (psDv.Count < 1)
  96. {
  97. pgSql.AppendFormat("insert into c_prodstate(prodid,isarrive)values({0},{1}) ;", drv["autoid"], 1);
  98. }
  99. else
  100. {
  101. pgSql.AppendFormat("update set c_prodstate set isarrive=1 where isarrive=0 and prodid={0} ;", drv["autoid"]);
  102. }
  103. }
  104. prodStr.Append("{").AppendFormat("\"cnum\":\"{0}\",\"pg\":\"{1}\",\"to\":\"1\"", drv["truckcode"], p).Append("}");
  105. }
  106. else if (enLat > 0 && Convert.ToInt32(drv["isArrive"]) == 1)
  107. {
  108. dist = GetDistance(enLat, enLng, Convert.ToDouble(drv["lat"]), Convert.ToDouble(drv["lng"]));
  109. p = Convert.ToInt32((dist / (sitemileage * 1000.0)) * 10);
  110. if ((dist - sitemileage * 1000.0) >= -500) //5-5.0>=-500
  111. {
  112. pgSql.AppendFormat("update set c_prodstate set isback=1 where isarrive=1 and prodid={0} ;", drv["autoid"]);
  113. }
  114. prodStr.Append("{").AppendFormat("\"cnum\":\"{0}\",\"pg\":\"{1}\",\"to\":\"0\"", drv["truckcode"], p).Append("}");
  115. }
  116. }
  117. else {
  118. prodStr.Append("{").AppendFormat("\"cnum\":\"{0}\",\"pg\":\"-1\",\"to\":\"1\"", drv["truckcode"]).Append("}");
  119. }
  120. y++;
  121. }
  122. if (pgSql.Length > 0)
  123. {
  124. SqlHelper.ExecuteNonQuery(pgSql.ToString());
  125. }
  126. if (k > 0) str.Append(",");
  127. str.Append("{").AppendFormat("\"sitename\":\"{0}\",\"project\":\"{1}\",\"cgrade\":\"{2}\",\"sitemileage\":\"{3}\",\"data\":{4}", dr["sitename"], dr["project"], dr["cgrade"], sitemileage, "[" + prodStr.ToString() + "]").Append("}");
  128. k++;
  129. }
  130. returnSuccess("[" + str.ToString() + "]");
  131. //con.Response.Write();
  132. //writeGridJson(dt.Rows.Count, Utils.Serialization.JsonString.DataTable2MiniAjaxJson(dt));
  133. }
  134. public void get_fastprod()
  135. {
  136. //DataStruct dStruct = GetStruct();
  137. //dStruct.MainWhere = "p1userid=" + CurrentUser.UserID + " and state=0 and isdel=0";
  138. //dStruct.Order = "createtime desc";
  139. //DataTable dt = WebCache.GetData("c_user", dStruct);
  140. StringBuilder sql = new StringBuilder();
  141. sql.Append("select sitename,project,cgrade from c_prod group by sitename,project,cgrade ;");
  142. sql.Append("select autoid,sitename,project,cgrade,truckcode,'' as lat,'' as lng,'' as flag,0.0 as rp,(select isback from c_prodstate where prodid=c_prod.autoid ) as isback from c_prod;");
  143. 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) ;");
  144. sql.Append("select * from c_cust where sitename in (select sitename from c_prod group by sitename) ;");
  145. sql.Append("select * from c_prodstate where prodid in (select autoid from c_prod) ;");
  146. DataSet ds = ErpSqlHelper.ExecuteDataSet(sql.ToString());
  147. DataTable pgDt = ds.Tables[0];
  148. DataTable prodDt = ds.Tables[1];
  149. DataTable gpsDt = ds.Tables[2];
  150. DataView gpsDv = new DataView(gpsDt);
  151. DataTable custDt = ds.Tables[3];
  152. DataView custDv = new DataView(custDt);
  153. DataView psDv = new DataView(ds.Tables[4]);
  154. foreach (DataRow dr in prodDt.Rows)
  155. {
  156. gpsDv.RowFilter = "PlateNum='" + dr["truckcode"] + "号'";
  157. if (gpsDv.Count > 0)
  158. {
  159. dr["lat"] = gpsDv[0]["Latitude"];
  160. dr["lng"] = gpsDv[0]["Longitude"];
  161. dr["flag"] = gpsDv[0]["StateFlag"];
  162. //dr["GpsTime"]= gpsDv[0]["GpsTime"];
  163. }
  164. }
  165. DataView prodDv = new DataView(prodDt);
  166. StringBuilder str = new StringBuilder();
  167. StringBuilder prodStr = new StringBuilder();
  168. int k = 0;
  169. int y = 0;
  170. double sitemileage = 0;
  171. string siteaddress = "";
  172. string sitelnglat = "";
  173. double enLng = 0;
  174. double enLat = 0;
  175. double dist = 0;
  176. double dist2 = 0;
  177. int p = 0;
  178. //bool is
  179. StringBuilder pgSql = new StringBuilder();
  180. foreach (DataRow dr in pgDt.Rows)
  181. {
  182. custDv.RowFilter = "sitename='" + dr["sitename"] + "'";
  183. if (custDv.Count > 0)
  184. {
  185. DataRowView cdrv = custDv[0];
  186. sitemileage = Convert.ToDouble(cdrv["sitemileage"]);
  187. siteaddress = cdrv["siteaddress"].ToString();
  188. sitelnglat = cdrv["lng"] + "|" + cdrv["lat"];
  189. if (cdrv["lng"].ToString() != "" && cdrv["lat"].ToString() != "")
  190. {
  191. enLng = Convert.ToDouble(cdrv["lng"]);
  192. enLat = Convert.ToDouble(cdrv["lat"]);
  193. }
  194. }
  195. prodStr = new StringBuilder();
  196. prodDv.RowFilter = "sitename='" + dr["sitename"] + "' and project='" + dr["project"] + "' and cgrade='" + dr["cgrade"] + "'";
  197. y = 0;
  198. foreach (DataRowView drv in prodDv)
  199. {
  200. if (drv["truckcode"].ToString() == "") continue;
  201. if (drv["isback"] != DBNull.Value && Convert.ToInt32(drv["isback"]) == 1) continue;
  202. //if(drv["truckcode"].ToString()=="21")
  203. //{
  204. // int c = 1;
  205. //}
  206. if (y > 0) prodStr.Append(",");
  207. p = 0;
  208. if (sitemileage > 0 && drv["lat"].ToString() != "" && drv["lng"].ToString() != "")
  209. {
  210. //psDv.RowFilter = "prodid=" + drv["autoid"];
  211. //if (psDv.Count >0 && Convert.ToInt32(drv["isBack"])==1)
  212. //{
  213. // continue;
  214. //}
  215. if (psDv.Count < 1 || Convert.ToInt32(drv["isArrive"]) == 0)
  216. {
  217. dist = GetDistance(comLat, comLng, Convert.ToDouble(drv["lat"]), Convert.ToDouble(drv["lng"]));
  218. dist2 = GetDistance(enLat, enLng, Convert.ToDouble(drv["lat"]), Convert.ToDouble(drv["lng"]));
  219. p = Convert.ToInt32((dist / (sitemileage * 1000.0)) * 10);
  220. if ((dist - sitemileage * 1000.0) >= -500) //5-5.0>=-500
  221. {
  222. if (psDv.Count < 1)
  223. {
  224. pgSql.AppendFormat("insert into c_prodstate(prodid,isarrive)values({0},{1}) ;", drv["autoid"], 1);
  225. }
  226. else
  227. {
  228. pgSql.AppendFormat("update set c_prodstate set isarrive=1 where isarrive=0 and prodid={0} ;", drv["autoid"]);
  229. }
  230. }
  231. prodStr.Append("{").AppendFormat("\"cnum\":\"{0}\",\"pg\":\"{1}\",\"to\":\"1\"", drv["truckcode"], p).Append("}");
  232. }
  233. else if (enLat > 0 && Convert.ToInt32(drv["isArrive"]) == 1)
  234. {
  235. dist = GetDistance(enLat, enLng, Convert.ToDouble(drv["lat"]), Convert.ToDouble(drv["lng"]));
  236. p = Convert.ToInt32((dist / (sitemileage * 1000.0)) * 10);
  237. if ((dist - sitemileage * 1000.0) >= -500) //5-5.0>=-500
  238. {
  239. pgSql.AppendFormat("update set c_prodstate set isback=1 where isarrive=1 and prodid={0} ;", drv["autoid"]);
  240. }
  241. prodStr.Append("{").AppendFormat("\"cnum\":\"{0}\",\"pg\":\"{1}\",\"to\":\"0\"", drv["truckcode"], p).Append("}");
  242. }
  243. }
  244. else {
  245. prodStr.Append("{").AppendFormat("\"cnum\":\"{0}\",\"pg\":\"-1\",\"to\":\"1\"", drv["truckcode"]).Append("}");
  246. }
  247. y++;
  248. }
  249. if (pgSql.Length > 0)
  250. {
  251. SqlHelper.ExecuteNonQuery(pgSql.ToString());
  252. }
  253. if (k > 0) str.Append(",");
  254. str.Append("{").AppendFormat("\"sitename\":\"{0}\",\"project\":\"{1}\",\"cgrade\":\"{2}\",\"sitemileage\":\"{3}\",\"address\":\"{4}\",\"lnglat\":\"{5}\",\"data\":{6}", dr["sitename"], dr["project"], dr["cgrade"], sitemileage, siteaddress, sitelnglat, "[" + prodStr.ToString() + "]").Append("}");
  255. k++;
  256. }
  257. returnSuccess("[" + str.ToString() + "]");
  258. //con.Response.Write();
  259. //writeGridJson(dt.Rows.Count, Utils.Serialization.JsonString.DataTable2MiniAjaxJson(dt));
  260. }
  261. public void get_cust()
  262. {
  263. DataStruct dStruct = GetPostStruct();
  264. List<string> lw = new List<string>();
  265. string key = GetPostString("key");
  266. if (key.Length > 0) lw.Add(string.Format("(customername like '%{0}%' or sitename like '%{0}%')", key));
  267. dStruct.Order = "siteid desc";
  268. dStruct.MainWhere = string.Join(" and ", lw.ToArray());
  269. DataTable dt = WebCache.GetErpData("c_cust", dStruct);
  270. writeGridJson(dStruct.TotalCount, Utils.Serialization.JsonString.DataTable2MiniAjaxJson(dt));
  271. }
  272. public void save_siteposition()
  273. {
  274. if (UrlPostParmsCheck("cid,lnglat,tenlnglat"))
  275. {
  276. int cid = GetPostInt("cid");
  277. string lnglat = GetPostString("lnglat");
  278. string[] lArr = lnglat.Split(',');
  279. string tenlnglat = GetPostString("tenlnglat");
  280. string[] tlArr = tenlnglat.Split(',');
  281. string address = GetPostString("address");
  282. string mileage = GetPostString("mileage");
  283. string sql = string.Format("update c_cust set lng='{0}',lat='{1}',tenlng='{2}',tenlat='{3}',siteaddress='{4}',sitemileage={5} where id={6}",
  284. lArr[0], lArr[1], tlArr[0], tlArr[1], address, mileage, cid);
  285. ErpSqlHelper.ExecuteNonQuery(sql);
  286. returnSuccessMsg("保存成功!");
  287. }
  288. }
  289. #region 距离
  290. //地球半径,单位米
  291. private const double EARTH_RADIUS = 6378137;
  292. /// <summary>
  293. /// 计算两点位置的距离,返回两点的距离,单位 米
  294. /// 该公式为GOOGLE提供,误差小于0.2米
  295. /// </summary>
  296. /// <param name="lat1">第一点纬度</param>
  297. /// <param name="lng1">第一点经度</param>
  298. /// <param name="lat2">第二点纬度</param>
  299. /// <param name="lng2">第二点经度</param>
  300. /// <returns></returns>
  301. public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
  302. {
  303. double radLat1 = Rad(lat1);
  304. double radLng1 = Rad(lng1);
  305. double radLat2 = Rad(lat2);
  306. double radLng2 = Rad(lng2);
  307. double a = radLat1 - radLat2;
  308. double b = radLng1 - radLng2;
  309. 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;
  310. return result;
  311. }
  312. /// <summary>
  313. /// 经纬度转化成弧度
  314. /// </summary>
  315. /// <param name="d"></param>
  316. /// <returns></returns>
  317. private static double Rad(double d)
  318. {
  319. return (double)d * Math.PI / 180d;
  320. }
  321. #endregion
  322. }
  323. }